2016-09-23 31 views
1

我真的很难与流星回调。我有一个客户端调用服务器端方法,但是当回调从服务器回来时,我得到一个未定义的结果。据我所知,这是因为服务器没有完成POST,但已经发送回调。我是流星新手,这看起来很困难。我至今:流星方法调用 - 等待方法完成

客户:

Meteor.call("createCustomer", city, fname, lname, email, function(error, result) { 
    if (error) { 
    console.log("error: " + error); 
    } else { 
    console.log("result: " + result) 
    } 
}); 

服务器:

Meteor.methods({ 
    'createCustomer': function(city, fname, lname, email) { 
    HTTP.call("POST", url+'/customer?api_key='+process.env.API_TOKEN ,{ 
     data: { 
     city: city, 
     first_name: fnam, 
     last_name: lname, 
     email: email 
     } 
    }, function (error, result) { 
     if (error) { 
     return 'error'; 
     } else { 
     return'success'; 
     } 
    }); 
    } 
}); 

我可能会做一些非常愚蠢的,比我预想的可能更为复杂,但任何帮助会走很长的路!

回答

1

这是Meteor.wrapAsync的用途。它创建一个异步函数的同步版本。试试这个:

'createCustomer': function(city, fname, lname, email) { 
    var call = Meteor.wrapAsync(HTTP.call, HTTP); 
    return call("POST", url+'/customer?api_key='+process.env.API_TOKEN ,{ 
    data: { 
     city: city, 
     first_name: fname, 
     last_name: lname, 
     email: email 
    } 
    }); 
} 
+0

感谢这么多,就像一个魅力 – PsydeStep

+0

@PsydeStep所以其实没有必要弯曲它的异步。如果你不通过'asyncCallback','HTTP.call'同步运行。 [阅读'asyncCallback'描述。](https://docs.meteor.com/api/http.html#HTTP-call) –

+0

@RamilMuratov感谢您的洞察力。考虑到Waiski的工作方式,这是正确的做法。 – PsydeStep

0

扩大我原来的评论。

在服务器上如果不通过回调,HTTP.call同步运行,并且不需要使用Meteor.wrapAsync

Meteor.methods({ 
    createCustomer(city, first_name, last_name, email) { 
    return HTTP.post(`${url}/customer?api_key=${process.env.API_TOKEN}`, { 
     data: { city, first_name, last_name, email } 
    }); 
    } 
});