javascript - 将相关数据与 promise 结果相结合

标签 javascript promise

我有一个对象数组,需要进行异步调用 对于每个模块,一旦完成所有调用,我想将每个模块打包为一个包含原始对象详细信息的对象,以及 异步调用的新结果,并将其全部放入数组中。

我在尝试弄清楚如何将原始模块对象与异步结合起来时遇到了一些麻烦 结果。

这就是我到目前为止所拥有的 -

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 的对象和 databuildHistory#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/

相关文章:

javascript - 在客户端使用 Jade 语言,应在服务器端编译而不影响条件

javascript - 从 Javascript Promise 链返回值

javascript - Node.js - 对内部带有模拟 promise 的函数进行单元测试

javascript - 产生依赖于递归 promise 的 promise

javascript - Promise 库中的 Promise join 实现

javascript - 我如何知道哪个 Promise 将首先解决?

javascript - 如何在 JavaScript 中制作最快的自下而上的树转换器?我应该自己管理内存吗?

javascript - 如何使嵌入在 HTML 中的 SVG 加载其 xlink :href dependencies?

javascript - kendoSplitter 内的 Pane 不遵守 "box-sizing:border-box"属性

javascript - 使用 JavaScript 向 img 标签添加类