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,一切都按预期工作。