时承诺最近我遇到了一个非常有趣的问题。背景是我想同时激发一堆http请求,并将每个响应的结果捕获到一个数组中。而且,当所有请求的承诺都解决了,。 我尝试了两种方式来实现它,但有时会得到不同的结果。Promise.Then的调度顺序Promise.all
请看下面的代码片段(httpHelper.get
刚刚返回蓝鸟承诺)。 溶液A:
function solutionA() {
var requestOptions = [...]; // an array of request options
var promises = [];
var results = [];
_.forEach(requestOptions, function(requestOption){
var promise = httpHelper.get(requestOption).then(function singleThenCallBack(response){
//Using this solution, sometimes this code won't execute from some response, I guess it's because the Promise.all.then gets executed before this then.
results.push(response.body.result);
});
promises.push(promise);
});
return Promise.all(promises).then(function allThenCallBack(){
return results;
});
}
溶液B:
function solutionB() {
var requestOptions = [...]; // an array of request options
var promises = [];
var results = [];
_.forEach(requestOptions, function singleThenCallBack(requestOption){
var promise = httpHelper.get(requestOption);
promises.push(promise);
});
return Promise.all(promises).then(function allThenCallBack(responses){
_.forEach(responses, function(response){
results.push(response.body.result);
});
return results;
});
}
因此,使用溶液A的问题是,有时singleThenCallBack
功能将不调用一些响应,所以results
不包含我应得到的每个结果。 解决方案B始终确保将所有结果推入数组results
。我想原因是计划如何then
为Promise
和Promise.all
。 我的问题是,A液中,不应该promises
是Promise.then
S的承诺,这将确保singleThenCallBack
功能适用于所有的反应应该被称为达到allThenCallBack
功能之前?
希望有人可以解释这种行为对我的原因。谢谢!
编辑: 所以我试图运行一些代码来证明的承诺与下面的代码链接:
var Promise = require("bluebird");
var promises = [];
var promise1 = new Promise(function(resolve, reject){
setTimeout(function() {
resolve(1);
}, 5000);
});
var thenPromise1 = promise1.then(function(value){
console.log("********* resolved promise1 *********: " + value);
console.log(promise1);
return 0.1;
}, console.log("*****This means then function is called synchronously."));
promises.push(thenPromise1);
thenPromise1.then(function(value){
console.log("********* resolved thenPromise1 *********: " + value);
console.log(thenPromise1);
});
var allPromise = Promise.all(promises);
allPromise.then(function(value){
console.log("********* resolved allPromise *********: " + value);
console.log(allPromise);
});
console.log("********* promise1 *********");
console.log(promise1);
console.log("********* thenPromise1 *********");
console.log(thenPromise1);
console.log("********* allPromise *********");
console.log(allPromise);
console.log("***********code end*************");
,输出是:
*****This means then function is called synchronously.
********* promise1 *********
{ _bitField: 1,
_fulfillmentHandler0: [Function],
_rejectionHandler0: undefined,
_promise0:
{ '2': 0,
'3':
{ _promise: [Object],
_values: [Object],
_length: 1,
_totalResolved: 0 },
_bitField: 2,
_fulfillmentHandler0: [Function],
_rejectionHandler0: undefined,
_promise0:
{ _bitField: 0,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_promise0: undefined,
_receiver0: undefined,
_trace: [Object] },
_receiver0: undefined,
_trace: { [Error] _parent: undefined, _promisesCreated: 0, _length: 1 } },
_receiver0: undefined,
_trace: { [Error] _parent: undefined, _promisesCreated: 0, _length: 1 } }
********* thenPromise1 *********
{ '2': 0,
'3':
{ _promise:
{ _bitField: 134217729,
_fulfillmentHandler0: [Function],
_rejectionHandler0: undefined,
_promise0: [Object],
_receiver0: undefined },
_values: [ [Circular] ],
_length: 1,
_totalResolved: 0 },
_bitField: 2,
_fulfillmentHandler0: [Function],
_rejectionHandler0: undefined,
_promise0:
{ _bitField: 0,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_promise0: undefined,
_receiver0: undefined,
_trace: { [Error] _parent: undefined, _promisesCreated: 0, _length: 1 } },
_receiver0: undefined,
_trace: { [Error] _parent: undefined, _promisesCreated: 0, _length: 1 } }
********* allPromise *********
{ _bitField: 134217729,
_fulfillmentHandler0: [Function],
_rejectionHandler0: undefined,
_promise0:
{ _bitField: 0,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_promise0: undefined,
_receiver0: undefined,
_trace: { [Error] _parent: undefined, _promisesCreated: 0, _length: 1 } },
_receiver0: undefined }
***********code end*************
********* resolved promise1 *********: 1
{ _bitField: 33554433,
_fulfillmentHandler0: [Function],
_rejectionHandler0: 1,
_promise0: undefined,
_receiver0: undefined,
_trace: { [Error] _parent: undefined, _promisesCreated: 0, _length: 1 } }
********* resolved thenPromise1 *********: 0.1
{ '2': 0,
'3':
{ _promise:
{ _bitField: 134217729,
_fulfillmentHandler0: [Function],
_rejectionHandler0: undefined,
_promise0: [Object],
_receiver0: undefined },
_values: [ [Circular] ],
_length: 1,
_totalResolved: 0 },
_bitField: 33554434,
_fulfillmentHandler0: [Function],
_rejectionHandler0: 0.1,
_promise0: undefined,
_receiver0: undefined,
_trace: { [Error] _parent: undefined, _promisesCreated: 0, _length: 1 } }
********* resolved allPromise *********: 0.1
{ _bitField: 167772161,
_fulfillmentHandler0: [Function],
_rejectionHandler0: [ 0.1 ],
_promise0: undefined,
_receiver0: undefined }
在输出中,thenPromise1
对象具有_promise0
,这是由thenPromise1.then(...)
创建的承诺。而'3'
后的承诺目标是,通过Promise.all(...)
,这意味着thenPromise1
后,这一承诺始终链接创建的承诺。 所以我认为这个问题是无效的,其他部分有问题。
你在哪里检查代码中'results'的数量? –
这里没有显示,它是SolutionA/B函数的调用者。 –
你真的应该使用'map'而不是'forEach' +'push' – Bergi