一旦获取所有URL并将其添加到对象mapGeometry中,我将使用下面的异步代码获取URL数组。我需要从函数returnMapGeometry返回mapGeometry,因此所有代码都需要暂停直到执行。

我在正确使用语法时遇到了很多麻烦,一旦所有获取均已解决且每个mapGeometryPiece已添加到mapGeometry中,如何返回mapGeometry?

function returnMapGeometry() {
  var mapGeometry = new THREE.Group();

  Promise.all(
    urls.map((url, index) => fetch(new Request(url))
      .then(response => response.blob())
      .then(blob => doSomeWork(URL.createObjectURL(blob))
        .then(mapGeometryPiece => {
          mapGeometry.add(mapGeometryPiece)
        })
      ))
  }
  // code must pause until returnMapGeometry() returns

  mapGeometry = returnMapGeometry()


注意:mapGeometry是Three.js组-我认为这没有什么区别,请参见:https://threejs.org/docs/#api/objects/Group

最佳答案

您需要在.then上链接并返回一个Promise.all,该mapGeometry可以使用您构造的returnMapGeometry进行解析,然后在调用mapGeometry时,它将使用Promise进行解析。因为它需要返回一个mapGeometry而不是实际的getMapGeometry,所以调用该函数稍有不同(例如.then)会更有意义。

您还可以删除doSomeWork上不必要的嵌套,以使代码更加扁平:

function getMapGeometry() {
  var mapGeometry = new THREE.Group();

  return Promise.all(
    urls.map((url, index) => fetch(new Request(url))
      .then(response => response.blob())
      .then(blob => doSomeWork(URL.createObjectURL(blob))
      .then(mapGeometryPiece => mapGeometry.add(mapGeometryPiece))
    ))
  )
    .then(() => mapGeometry);
  // code must pause until returnMapGeometry() returns
}
getMapGeometry()
  .then((mapGeometry) => {
    // do stuff with mapGeometry
  });

关于javascript - 从包含promise.all的函数返回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51054124/

10-10 22:18