Javascript 作用域、内联函数和异步操作
Javascript Scoping, Inline functions, and asynchronous operations
我正在开发地理处理网络应用程序。我的应用程序会为用户提供一组特定的选项,用户会提供一些数据,然后我会在服务器上处理这些数据,最后得到 return 结果。如果重要的话,我正在使用 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() 块和内联函数的范围内访问。我的问题是我尝试使用的输出仅在初始化函数的范围内。我不确定将处理后的数据传送到我想要的位置的最佳方法是什么。这是一个问题,因为处理后的数据是几何信息 - 它不像文本那样易于阅读,因此需要在地图上显示。
我一直在研究 JS 作用域并查看参考资料以试图找出我的问题所在,但我真的无法弄清楚。
承诺的要点之一是 then
returns 对最终在其 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
});
我正在开发地理处理网络应用程序。我的应用程序会为用户提供一组特定的选项,用户会提供一些数据,然后我会在服务器上处理这些数据,最后得到 return 结果。如果重要的话,我正在使用 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() 块和内联函数的范围内访问。我的问题是我尝试使用的输出仅在初始化函数的范围内。我不确定将处理后的数据传送到我想要的位置的最佳方法是什么。这是一个问题,因为处理后的数据是几何信息 - 它不像文本那样易于阅读,因此需要在地图上显示。
我一直在研究 JS 作用域并查看参考资料以试图找出我的问题所在,但我真的无法弄清楚。
承诺的要点之一是 then
returns 对最终在其 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
});