Javascript 将相关数据与预期结果相结合
我有一个需要进行异步调用的对象数组 对于每一个,一旦所有调用都完成了,我想将每个模块打包为一个包含原始对象细节的对象,以及 异步调用的新结果,并将所有结果放在一个数组中 我在试图找出如何将原始模块对象与异步对象组合时遇到了一些问题 结果 这就是我目前所拥有的-Javascript 将相关数据与预期结果相结合,javascript,promise,Javascript,Promise,我有一个需要进行异步调用的对象数组 对于每一个,一旦所有调用都完成了,我想将每个模块打包为一个包含原始对象细节的对象,以及 异步调用的新结果,并将所有结果放在一个数组中 我在试图找出如何将原始模块对象与异步对象组合时遇到了一些问题 结果 这就是我目前所拥有的- const modules = [{name: 'module1', id: 1}, {name: 'module2', id: 2}, ..etc]; let modulesHistory = []; // my final arra
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
中,并手动解析为使用当前模块
和从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所建议的,我们可以通过避免创建新承诺来进一步压缩此功能:
let modulesPromises = modules.map(module => {
return new BuildHistory(module.id)
.fetch()
.then(data => ({module, data}))
})
实际上,正如@ Bergi在评论中提到的,您应该考虑使用En6中可用的承诺来实现最终结果:
Promise.all(modulePromises).then(res => {
// res is an array of the result of each Promise in `modulePromises`
})
您似乎正在使用ES6-为什么不使用本地承诺?