我有一些诺言和一个Promise.all:
array = [];
var one = new Promise(function(resolve, reject) {
// Do stuff
setTimeout(function() {
resolve('One Done');
array.push('one');
}, 5000);
});
var two = new Promise(function(resolve, reject) {
// Do Stuff
resolve('Two Done');
array.push('two');
});
Promise.all(array).then(values => {
console.log(values);
});
我们知道这行不通,因为array.push必须在外面。
我目前有一些需要由promise调用的功能,以便最终可以在Promise.all中使用它。
建议像这样从promise内部调用函数:
function dosomething() {
// does something
array.push('something');
}
var mypromise = new Promise(function(resolve, reject) {
dosomething();
resolve('Did something');
});
或者有更明智的方法吗?
答案 0 :(得分:3)
Promise.All期望有一系列的Promise,并会等到所有Promise都兑现后,为您提供每个Promise的结果,或者在任何Promise失败的情况下提供给您。
如果您愿意使用多个对象(而不只是一个字符串)来解析它们,则可以使用任何类型的对象来解析它们,并且以后可以以任何所需的方式使用结果,因此可以避免从答应,而是将“工作项”作为一个整体来解决,并在异步评估后使用所有必需的结果。
(我认为)这还将使代码更整洁,更易于管理。
您可以尝试执行以下操作:
var valuesArray=[];
var prom1 = new Promise(function(resolve, reject) {
// Do stuff
setTimeout(function() {
resolve({ msg: 'One Done', data : 'one'});
// array.push('one');
}, 5000);
});
var prom2 = new Promise(function(resolve, reject) {
// Do Stuff
resolve({ msg: 'Two Done', data : 'two'});
// array.push('two');
});
var promisesArray= [prom1,prom2];
Promise.all(promisesArray).then(values => {
// do stuff with values here
console.log(values[0].msg);
console.log(values[1].msg);
valuesArray.push(values[0].data);
valuesArray.push(values[0].data);
});
答案 1 :(得分:2)
Promise.all
等待Promises
的数组。在您的示例中,您始终将string
类型推入数组。这显然行不通。在第一个示例中,您想自己兑现承诺:
array = [];
var one = new Promise(function(resolve, reject) {
// Do stuff
setTimeout(function() {
resolve('One Done');
}, 5000);
});
array.push(one);
var two = new Promise(function(resolve, reject) {
// Do Stuff
resolve('Two Done');
});
array.push(two);
Promise.all(array).then(values => {
console.log(values);
});
只要数组包含Promise
个对象,Promise.all
就会按预期工作。
答案 2 :(得分:0)
我认为,如果您使用Promises数组调用Promise.all
,而每个Promise都解析为所需的值,则根本不需要外部数组也不使用push
,这将是最清晰的:
var one = new Promise(function(resolve, reject) {
// Do stuff
setTimeout(function() {
console.log('One Done')
resolve('one');
}, 1000);
});
var two = new Promise(function(resolve, reject) {
// Do Stuff
console.log('Two Done');
resolve('two');
});
Promise.all([one, two]).then(arr => {
console.log(arr);
});
如果您需要两个值('One Done'
和 'one'
),则可以使用同时包含两个值的数组来解析初始promise,从而可以完成所有操作'One Done'
,然后解析为'one'
与Promise.all
创建的数组链接:
const logAndReturn = ([logStr, finalResolveStr]) => {
console.log(logStr);
return finalResolveStr;
}
var one = new Promise(function(resolve, reject) {
// Do stuff
setTimeout(function() {
resolve(['One Done', 'one']);
}, 1000);
});
var two = new Promise(function(resolve, reject) {
// Do Stuff
resolve(['Two Done', 'two']);
});
Promise.all([
one.then(logAndReturn),
two.then(logAndReturn),
]).then(arr => {
console.log(arr);
});