为promise结果对象的每个数组元素调用async函数,进行更改并返回此对象

时间:2015-04-10 16:18:24

标签: javascript asynchronous promise bluebird

Bluebird Promise返回一个包含两个对象,汽车和合约数组的对象。然后,我想迭代汽车,调用异步函数,并根据返回的值,对第二个数组进行一些更改,并返回初始结果对象和这些更改。我无法弄清楚如何用承诺做到这一点。或者使用异步,就此而言。我觉得他们应该是嵌套的承诺,但我可以让它完全发挥作用。

带有承诺的版本:

somePromise().then(function (result) {

    Promise.each(result.cars, function (car) {
        makeAsyncCall(car.id, function (err, resultArray) {
            if (err) {
                throw new Error();
            }

            result.contracts.forEach(function (contract) {
                if (resultArray.indexOf(contract.id) > -1) {
                    contract.car = car.id;
                }
            });
        });

    }).then(function (eachResult) {
        //eachResult is result.firstArray, which is not interesting.
        return result;
    });

}).then(function (result)) {
    //this gets called before my promise.each gets executed??
}

任何人都可以告诉我我的错误在哪里吗?

1 个答案:

答案 0 :(得分:1)

查看我的rules of thumb承诺开发。适用于您的代码的两个特定点是:

  • 在使用之前宣传你的异步回调函数,特别是

    var makeCall = Promise.promisify(makeAsyncCall);
    
  • 始终return承诺来自执行异步操作的函数。回调尤其如此,例如function() { Promise.each(…).then(…) }function() { makeAsyncCall(…) }

有了这些,您应该了解以下内容:

somePromise().then(function(result) {
    return Promise.each(result.cars, function(car) {
        return makeCall(car.id).then(function(resultArray) {
            // a lookup structure of contracts by id could make this more efficient
            result.contracts.forEach(function (contract) {
                if (resultArray.indexOf(contract.id) > -1)
                    contract.car = car.id;
            });
        });
    }).return(result);
}).…