我正在处理地理处理网络应用程序。我的应用程序将为用户提供一组特定的选项,用户将提供一些数据,然后我将处理服务器上的数据并最终返回结果。如果重要的话,我使用CMV http://docs.cmv.io/en/1.3.3/作为框架并尝试构建我自己的插件,但我怀疑我的问题是更普遍的JS问题。这是一个伪代码样本 (请注意,这是伪代码而不是我的实际代码,目前这是一个混乱) :
initializeTool: function() {
//here I am able to access my map object through this.map
//and I need it for my output
on(dom.byId("mybutton"), "click", processInput);
}
processInput: function() {
//pull user data from webpage
var userData, queries;
//launch query for all data
for(var i in userData){
queries[i] = query(userData[i]);
}
//deferredlist is from Dojo, doc here: http://dojotoolkit.org/api/?qs=1.10/dojo/DeferredList
new DeferredList(queries).then(function (results) {
//iterate over query responses and perform work
for(var i in queries){
//peform some synchronus operations
}
//and now we're done! but how do I get to my output?
}
}
在这种情况下,所需的输出是一组对其进行了各种操作的对象,但只能在then()块和内联函数的范围内访问。我的问题是我尝试使用的输出仅在initialize函数的范围内。我不确定将处理过的数据放到我想要的地方的最佳方法是什么。这是一个问题,因为处理过的数据是几何信息 - 它不像文本一样是人类可读的,因此需要在地图上显示。
我一直在倾向于JS范围界定并查看参考文献,试图弄清楚我的问题是什么,但我真的无法理解。
答案 0 :(得分:1)
承诺的一个要点是then
返回对其onFulfill
处理程序中最终返回的内容的承诺。这使您能够从processInput()
函数中获取结果并进入其外部的世界。
所以你可以(而且应该)这样做:
function processInput() {
//pull user data from webpage
var userData;
//launch query for all data
return Promise.all(userData.map(query))
.then(function (results) {
var theResult;
//iterate over query responses and perform work
results.forEach(function (result) {
//peform some synchronus operations and determine theResult
});
return theResult;
});
}
processInput().then(function (theResult) {
// do something with theResult
});