Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数之间的JavaScript承诺';类别';包装纸_Javascript_Promise - Fatal编程技术网

函数之间的JavaScript承诺';类别';包装纸

函数之间的JavaScript承诺';类别';包装纸,javascript,promise,Javascript,Promise,我不熟悉承诺,希望解决以下情况: 考虑表示three.js-Scene的主“类”函数main(),以及表示要渲染的数据的“子类”函数sub(): Main()有一个调用new的方法addSubDataToObject() Sub()进入Main().data对象({id\u x:data\u from\u url\u x}) Main()有另一种方法renderDataObjects()来呈现数据 (通过three.jsaddToScene()) Sub()通过调用时的方法getData()检

我不熟悉承诺,希望解决以下情况:

考虑表示three.js-Scene的主“类”函数
main()
,以及表示要渲染的数据的“子类”函数
sub()

  • Main()
    有一个调用
    new的方法
    addSubDataToObject()
    Sub()
    进入
    Main().data
    对象(
    {id\u x:data\u from\u url\u x}
  • Main()
    有另一种方法
    renderDataObjects()
    来呈现数据 (通过three.js
    addToScene()
  • Sub()
    通过调用时的方法
    getData()
    检索远程数据 (使用
    XMLHttpRequest
    调用WebWorker)并将其作为对象返回(
    {id:data\u from\u 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()
.addSubDataToObject()
将每个承诺返回到承诺数组中,并使用
promise.all()
使.renderDataObject()等待在呈现之前解析所有承诺。

但是,我不知道如何结合数据对象来实现这一点,也不知道如何处理带有承诺的“类”对象。如果可能的话(对您来说这似乎很实用),我将非常感谢为这个场景提供一个示例结构。

如果我理解这个问题,您只想知道如何在类函数中使用承诺?这就是你要找的吗

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);

绝对差不多,)我希望将承诺逻辑包装在.renderDataObject()中。这是否像添加Promissions数组作为类变量一样简单,从.addSubDataObject(id,url)(Promissions.push()而不是return?)中填充它,并使用Promission.all(Main.Promissions)在.renderDataObject()中执行。然后(通过数据数组循环)?更新:我测试过了,就这么简单!谢谢你提供了这么多好的信息,让我知道了最后的化妆品变化!