2017-03-23 45 views
0

我正在使用viewer.getProperties(dbId, onSuccessCallback, onErrorCallback)方法来获取查看器中对象的属性。我想为所有选定对象运行该方法,为每个对象提取属性的子集,并将子集呈现在表中。为多个元素并行运行viewer.getProperties,然后处理结果

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不是问题。

正如我能看到的,我一直在寻找来自bluebird.js的Promise.all()以控制执行并等待所有getProperties调用返回,但到目前为止失败。

问候, Torjus

回答

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 

这里是一个文章,我写了一篇关于使用异步/等待与观众,但由于话题要广泛得多,你应该能够通过自己寻找在网上找了很多更多的文档:

Getting rid of JavaScript callbacks using async/await

希望帮助

+0

您能否接受答复作为答复或解释它如何解决您的问题?谢谢 –

+0

谢谢Philippe!这工作完美,我认为getProperties方法有问题,但事实证明我误解了解析和拒绝的使用。 – torjuss

相关问题