我有一个对象数组,需要进行异步调用 对于每个模块,一旦完成所有调用,我想将每个模块打包为一个包含原始对象详细信息的对象,以及 异步调用的新结果,并将其全部放入数组中。
我在尝试弄清楚如何将原始模块对象与异步结合起来时遇到了一些麻烦 结果。
这就是我到目前为止所拥有的 -
const modules = [{name: 'module1', id: 1}, {name: 'module2', id: 2}, ..etc];
let modulesHistory = []; // my final array object
let modulesPromises = []; // store all my promises
modules.forEach((module) => {
const buildHistory = new BuildHistory(module.id); // my collection
// I tried to do something like this
// but it's not really doing it:
//
// modulesHistory.push({
// module: module,
// builds: buildHistory
// });
modulesPromises.push(buildHistory.fetch()); // fetch returns a promise
});
$.when.apply($, modulesPromises).done(function(){
// Afterwards I'd like modulesHistory to look like:
// [
// {
// module: {
// name: 'module1',
// id: 1
// },
// data: {
// // stuff returned from asyc
// }
// },
// {
// module: {
// name: 'module2',
// id: 2
// },
// data: {
// // stuff returned from asyc
// }
// }
// ]
doStuff(modulesHistory);
});
最佳答案
增强对buildHistory#fetch
的调用结果将其包裹在 new Promise
中并手动解析为采用当前 module
的对象和 data
从 buildHistory#fetch
返回:
let modulesPromises = modules.map(module => {
const buildHistory = new BuildHistory(module.id)
return new Promise(res => buildHistory.fetch().then(data => res({module, data}))
})
或者,正如 @torazaburo 所建议的,我们可以通过避免创建 new Promise
来进一步压缩此功能。 :
let modulesPromises = modules.map(module => {
return new BuildHistory(module.id)
.fetch()
.then(data => ({module, data}))
})
事实上,正如 @Bergi 在评论中提到的,您应该考虑使用 Promises 的 native 实现(在 ES6 中可用)来访问最终结果:
Promise.all(modulePromises).then(res => {
// res is an array of the result of each Promise in `modulePromises`
})
关于javascript - 将相关数据与 promise 结果相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32551060/