函数'class'包装器

时间:2017-06-01 15:57:25

标签: javascript promise

我是承诺的新手,想要解决以下问题:

考虑一个主要的'class'函数Main(),它代表一个three.js-Scene和一个'子类'函数Sub(),它代表要渲染的数据:

  • Main()有一个方法addSubDataToObject(),可以new Sub()调用Main().data个对象({id_x: data_from_url_x}
  • Main()有另一种方法renderDataObjects()来呈现数据 (通过three.js addToScene()
  • Sub()在调用时通过方法getData()检索远程数据 (使用XMLHttpRequest调用WebWorker)并将其作为对象进行处理({id: data_from_url}

调用后

var main = new Main();

我希望能够添加多个数据对象

main.addSubDataToObject(id_1, url_1);
main.addSubDataToObject(id_2, url_2);

并致电

main.renderDataObject();

当所有数据调用完成下载和处理时,将main.data中的每个对象渲染到场景中。

目前,我使用回调将每个数据调用添加到场景中

main.addSubDataToObject(id_1, url_1, cb);
main.addSubDataToObject(id_1, url_2, cb);

但是,当然,这会按顺序添加它们,并根据有效负载进行延迟。

我想,例如,让Main()的{​​{1}}将一个承诺返回到一系列承诺中,.addSubDataToObject().renderDataObject()一起等待解决所有承诺在渲染之前 但是,我没有得到如何与数据对象一起实现它以及如何使用promises处理'class'对象。如果可能的话(这对您来说似乎很实用),我非常感谢这种情况的示例结构。

1 个答案:

答案 0 :(得分:1)

如果我理解了这个问题,你只想知道如何在类函数中使用Promises?这是你在找什么?

class Main {
  renderDataObject(data) {
    /* data will be an array of all resolvedData in the order they were resolved */
  }

  addSubDataToObject(id, url) {
    return new Promise(function(resolve, reject) {
      // do work

      resolve(/* resolvedData? */);
    });
  }
}

let main = new Main();
let promises = [];

promises.push(main.addSubDataToObject(id_1, url_1));
promises.push(main.addSubDataToObject(id_2, url_2));

Promise.all(promises).then(main.renderDataObject);