要等待所有这些承诺,您必须将它们放入一个数组中,以便您可以使用Promise.all()
在他们。你可以这样做:
let promises = [];
for (item of data_arr) {
promises.push(item.swag);
promises.push(item.version);
promises.push(item.timestamp);
promises.push(item.description);
}
Promise.all(promises).then(function(results) {
// all promises done here
})
如果您想要所有这些承诺中的值,请返回到对象中,这需要更多的工作。
let promises = [];
for (item of data_arr) {
promises.push(item.swag);
promises.push(item.version);
promises.push(item.timestamp);
promises.push(item.description);
}
Promise.all(promises).then(function(results) {
// replace promises with their resolved values
let index = 0;
for (let i = 0; i < results.length; i += 4) {
data_arr[index].swag = results[i];
data_arr[index].version = results[i + 1];
data_arr[index].timestamp = results[i + 2];
data_arr[index].description = results[i + 3];
++index;
});
return data_arr;
}).then(function(data_arr) {
// process results here in the array of objects
});
如果您必须更频繁地执行此操作而不是一次,则可以删除属性名称的硬编码,并可以迭代所有属性,收集包含承诺的属性名称并自动处理这些属性。
而且,这是一个更通用的版本,它采用对象数组,其中对象的某些属性是承诺的。此实现修改了对象上的 Promise 属性(它不复制对象数组)。
function promiseAllProps(arrayOfObjects) {
let datum = [];
let promises = [];
arrayOfObjects.forEach(function(obj, index) {
Object.keys(obj).forEach(function(prop) {
let val = obj[prop];
// if it smells like a promise, lets track it
if (val && val.then) {
promises.push(val);
// and keep track of where it came from
datum.push({obj: obj, prop: prop});
}
});
});
return Promise.all(promises).then(function(results) {
// now put all the results back in original arrayOfObjects in place of the promises
// so now instead of promises, the actaul values are there
results.forEach(function(val, index) {
// get the info for this index
let info = datum[index];
// use that info to know which object and which property this value belongs to
info.obj[info.prop] = val;
});
// make resolved value be our original (now modified) array of objects
return arrayOfObjects;
});
}
你可以像这样使用它:
// data_arr is array of objects where some properties are promises
promiseAllProps(data_arr).then(function(r) {
// r is a modified data_arr where all promises in the
// array of objects were replaced with their resolved values
}).catch(function(err) {
// handle error
});
使用蓝鸟承诺图书馆,您可以同时使用Promise.map()
and Promise.props()
上面的函数就是这样:
function promiseAllProps(arrayOfObjects) {
return Promise.map(arrayOfObjects, function(obj) {
return Promise.props(obj);
});
}
Promise.props()
迭代一个对象以查找所有将 Promise 作为值并使用的属性Promise.all()
等待所有这些承诺,它返回一个具有所有原始属性的新对象,但承诺被解析值替换。由于我们有一个对象数组,因此我们使用Promise.map()
迭代并等待所有这些。