Параллельный запуск viewer.getProperties для нескольких элементов и последующая обработка результата

Я использую viewer.getProperties(dbId, onSuccessCallback, onErrorCallback) для получения свойств объектов в моей программе просмотра. Я хочу запустить метод для всех выбранных объектов, извлечь подмножество свойств для каждого объекта и представить подмножества в таблице.

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 работает асинхронно, я не могу дождаться всех объектов до обновления таблицы. Таблица обновляется по одному объекту за раз, и мы бы предпочли обновить все сразу. Блокировка IO не проблема.

Как видно, я искал Promise.all() от bluebird. .js, чтобы контролировать выполнение и ждать возврата всех вызовов getProperties, но пока безуспешно.

С уважением, Торьюс.


person torjuss    schedule 23.03.2017    source источник


Ответы (1)


Этот вопрос совершенно не связан с использованием средства просмотра, вам нужно будет найти некоторую документацию о том, как использовать промисы, чтобы дождаться выполнения нескольких запросов параллельно.

вот некоторый псевдокод, который может вам помочь (синтаксис 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 со средством просмотра, но, поскольку тема намного шире, вы сможете найти гораздо больше документации, самостоятельно просмотрев в Интернете:

Избавление от обратных вызовов JavaScript с помощью асинхронно/ожидание

надеюсь, это поможет

person Philippe    schedule 24.03.2017
comment
Не могли бы вы принять ответ как ответ или объяснить, почему он не решает вашу проблему? Спасибо - person Philippe; 27.03.2017
comment
Спасибо, Филипп! Это сработало отлично, я думал, что что-то не так с методом getProperties, но оказалось, что я неправильно понял использование разрешения и отклонения. - person torjuss; 29.03.2017