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
});