Javascript异步函数链

时间:2015-02-18 15:19:53

标签: javascript http asynchronous promise rsvp.js

我在Node服务器上有一组JavaScript函数,它们向外部API发出HTTP请求。我试图将它们联系起来。我的HTTP请求函数返回一个promise,所以我一直在尝试使用.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中执行异步操作,则无法保证它将正确返回。我认为结果数组正在填充,我只是在错误的时间返回它?但我不确定在所有承诺都履行之后我在哪里/如何归还它。想法?

编辑添加创建承诺的功能。也许我做错了?

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框架。如果我对返回的promise做了一个console.log,那么关于它的一切都是未定义的?但是使用callAPI的函数仍然有效吗?我可以把它们链接起来然后呢?也许我错过了什么。

1 个答案:

答案 0 :(得分:0)

我删除了RSVP并改为使用Bluebird。无论出于何种原因,即使所有的承诺都得到满足,RSVP.all()也永远不会被解雇。我切换到蓝鸟,一切都按预期工作。