运行 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
希望对您有所帮助
我正在使用 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
希望对您有所帮助