我看过很多关于它的帖子,但我仍然不理解回调。 我得到了这样的函数:
function getData (url) {
request(url, function (error, response, data) {
//...
return data;
}
});
}
var data = getData(url);
// I got undefined because it's not finished
if (data)
...
我如何等待返回我的功能继续。我已经看过很多关于回调和承诺的事情,但在这种情况下如何使用呢? 例如,我见过this post,但我不明白答案。
我正在使用节点js
答案 0 :(得分:4)
首先,你有这样的问题。
问题在于,当您使用“请求”时,您需要了解编程中的异步。功能您的代码将并行执行,因此您不必等待服务器等待。
实际上,您需要在请求函数中使用if(数据)。
这样的事情。
request(url, function(error, response, data){
//your if and your code after the response of this request need's to be placed here.
}
如果你想在服务器响应之后处理请求,那么你就是这样做的,但是这样你的请求返回时总是有相同的代码?
所以你可以使用'回调'现在认为它是一个代表一个函数的变量。这有点奇怪,但你及时赶到
好的,所以你将创建一个名为' callback'的变量。代表一个功能,但是!魔法发生在这里,如果你使用的是一个变量,你可以在编写代码之前改变它。查看下面的示例。
function getData(url, callback){
request(url, function(error, response, data){
callback(error, response, data);
}
//so when you use this function you can use another function in response like this.
getData('someUrl', function(error, response, data)
{
//this piece of code will only be executed AFTER the request function returns.
});
我google了一下,发现该节点有一些同步调用,但如果你只使用同步功能在节点中构建一个系统,你应该更改你的服务器代码。
答案 1 :(得分:0)
getData
应该将回调作为参数。
function getData(url, callback) {
request(url, function (error, response, data) {
callback(data);
});
}
getData(url, function(data) {
if (data) {
...
}
});
答案 2 :(得分:0)
首先,您需要了解调用 getData 的主线程将完成,而另一个将在请求函数上打开,因此您需要继续在那个新线程中。为此,您需要一个回调函数,这是您作为参数发送到 getData 函数的一段代码,可以在请求函数完成时执行。你可以这样做:
function getData (url, callback) {
request(url, function (error, response, data) {
callback(data);
}
});
}
getData(url, function(data){
// do something with the data returned
});