function getStuff(serial){
return new Promise(function (fulfill, reject){
request("url using serial", function (error, response, body){
try {
fulfill(body);
} catch (error) {
reject(error);
}
}, reject);
});
}
while(FLAG) {
var p = getStuff(x);
p.then(function(obj){
console.log(obj)
if(some condition on obj) FLAG = false
})
//WAIT HERE TILL ITS DONE!!!!
}
如何使用此承诺使用循环顺序执行一系列使用不同序列的调用?
答案 0 :(得分:2)
使用节点,您需要为异步调用构建代码。
kkreft的评论描述了一些可用于帮助解决此问题的工具。
您的代码的实现可能是:
var x = 1
var list = []
function trial(callback) {
http.get("endpoint url", function (err, response) {
x++;
list.append(response.data);
if (err)
callback(err);
else
callback(null, x);
});
}
trial(function(err, r) {
console.log(r);
console.log(list);
});
答案 1 :(得分:1)
简短的回答是你不是。你想要对从这样的调用回来的数据做的任何事都必须在回调中。所以:
var x = 1
function trial() {
http.get("endpoint url", function (response) {
x++;
list.push(response.data);
console.log(x) // 2
});
return x;
}
console.log(trial())// 1
您调度的电话是异步的。目前,规范中没有任何内容可以让我们等待通话结果。无论需要多长时间,所有同步代码(函数外部的所有内容)都将在调用结果返回之前执行。因此,您必须处理回调内的数据或管理异步的其他内容,如promises。