Javascript作用域,内联函数和异步操作

时间:2015-03-27 20:22:39

标签: javascript asynchronous dojo scope promise

我正在处理地理处理网络应用程序。我的应用程序将为用户提供一组特定的选项,用户将提供一些数据,然后我将处理服务器上的数据并最终返回结果。如果重要的话,我使用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范围界定并查看参考文献,试图弄清楚我的问题是什么,但我真的无法理解。

1 个答案:

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