运行 viewer.getProperties 并行多个元素然后处理结果

Running viewer.getProperties for multiple elements in parallel and then handling the result

我正在使用 viewer.getProperties(dbId, onSuccessCallback, onErrorCallback) 方法来获取查看器中对象的属性。我想 运行 所有选定对象的方法,提取每个对象的属性子集,并将子集呈现在 table.

var subsets = [];
var selectFunctions = [];
handleSelection(selection, addProps, onError);

function handleSelection(selection, onSuccess, onError) {
  for (var i = 0; i < selection.length; i++)
    selectFunctions.push(_viewer.getProperties(selection[i], onSuccess, onError));
}

function addProps(data) { 
  var props = [];
  for (var prop in data.properties) {
    //Add property to props if some condition is true...
  }

  subsets.push(props);
}

Promise.all(_selectFunctions).then(function () {
  console.log("Handled all selections");
  //Add subsets to table...
}).catch(function (error) {
  console.log("ERRROR");
});

由于 getProperties 运行 是异步的,因此我无法在更新 table 之前等待所有对象。 table 一次更新一个对象,我们宁愿一次更新所有对象。阻塞IO不是问题。

正如可能显示的那样,我一直在从 bluebird.js 研究 Promise.all() 以控制执行并等待对 return 的所有 getProperties 调用,但到目前为止没有成功。

此致, 托茹斯

此问题与查看器的使用完全无关,您需要查找有关如何使用 Promises 以并行等待多个请求完成的文档。

这里有一些可能对您有帮助的伪代码(ES6 语法),为了清楚起见,我跳过了错误处理:

// wrap get the async method in a promise so you can wait its completion
const getPropertiesAsync = (id) => {
   return new Promise((resolve, reject) => {

     _viewer.getProperties(id, (result) => {

        resolve(result)

      }, (error) => {

        reject(error)
      })
   })
} 

//create an array of asynchronous tasks for each component you want to get props on
const propTasks = componentIds.map((id) => {

  return getPropertiesAsync(id)
})

//promise version 
Promise.all(propTasks).then((results) => {

 //populate table with results
})

//OR async ES7 syntax
const results = await Promise.all(propTasks)

//populate table with results

这是我写的一篇关于使用 async/await 查看器的文章,但由于该主题更广泛,您应该能够通过自己浏览网络找到更多文档:

Getting rid of JavaScript callbacks using async/await

希望对您有所帮助