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??
}
任何人都可以告诉我我的错误在哪里吗?
答案 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);
}).…