Javascript 异步函数链接
Javascript Asynchronous Function Chaining
我在节点服务器上有一组 JavaScript 函数,它们正在向外部 API 发出 HTTP 请求。我正在尝试将它们链接起来。我的 HTTP 请求函数 return 是一个承诺,所以我一直在尝试使用 .then()。
var x = function(id){
//Passes a URL and the ID provided and returns a promise
return callAPI(url, id)
}
var y = function(id){
//Same deal. Different URL, but calls a URL with an ID and returns a promise.
return allAPI(url, id)
}
var z = function(id){
var result = [];
x(id).then(function(data){
var promises = data.body.ids.map(function(id){
return y(id);
});
RSVP.all(promises).then(function(){
console.log('Promises finished') //this never runs
});
});
}
我读到 forEach 是同步的,但如果您在 forEach 中执行异步操作,则无法保证它会 return 正确。我认为结果数组正在填充,我只是在错误的时间 returning 它?但我不确定 where/how 我是否可以 return 在所有承诺都兑现之后。想法?
编辑 添加创建承诺的函数。也许我做错了?
var callAPI = function(url, query){
var promise = new RSVP.Promise(function(resolve, reject){
su.get(url)
.query(query)
.on('error', function(){
reject(this);
})
.end(function(res){
resolve(res);
});
});
return promise;
}
这使用了 SuperAgent HTTP 框架。如果我在 returned promise 上做一个 console.log,关于它的一切都是未定义的?但是使用 callAPI 的函数还能用吗?我还可以用 .then 链接它们吗?也许我错过了什么。
我删除了 RSVP,改用 Bluebird。无论出于何种原因,即使所有承诺都已兑现,RSVP.all() 也从未触发。我切换到 Bluebird,一切都按预期工作。
我在节点服务器上有一组 JavaScript 函数,它们正在向外部 API 发出 HTTP 请求。我正在尝试将它们链接起来。我的 HTTP 请求函数 return 是一个承诺,所以我一直在尝试使用 .then()。
var x = function(id){
//Passes a URL and the ID provided and returns a promise
return callAPI(url, id)
}
var y = function(id){
//Same deal. Different URL, but calls a URL with an ID and returns a promise.
return allAPI(url, id)
}
var z = function(id){
var result = [];
x(id).then(function(data){
var promises = data.body.ids.map(function(id){
return y(id);
});
RSVP.all(promises).then(function(){
console.log('Promises finished') //this never runs
});
});
}
我读到 forEach 是同步的,但如果您在 forEach 中执行异步操作,则无法保证它会 return 正确。我认为结果数组正在填充,我只是在错误的时间 returning 它?但我不确定 where/how 我是否可以 return 在所有承诺都兑现之后。想法?
编辑 添加创建承诺的函数。也许我做错了?
var callAPI = function(url, query){
var promise = new RSVP.Promise(function(resolve, reject){
su.get(url)
.query(query)
.on('error', function(){
reject(this);
})
.end(function(res){
resolve(res);
});
});
return promise;
}
这使用了 SuperAgent HTTP 框架。如果我在 returned promise 上做一个 console.log,关于它的一切都是未定义的?但是使用 callAPI 的函数还能用吗?我还可以用 .then 链接它们吗?也许我错过了什么。
我删除了 RSVP,改用 Bluebird。无论出于何种原因,即使所有承诺都已兑现,RSVP.all() 也从未触发。我切换到 Bluebird,一切都按预期工作。