处理并等待以前的JavaScript调用完成

时间:2013-06-01 17:16:27

标签: javascript google-maps javascript-events listener

我有一个与Google地图上的鼠标点击事件绑定的功能。由于功能的性质,处理完成可能需要一些时间(.1秒 - 2秒,具体取决于连接速度)。本身并不是一个问题,但如果用户点击满意,这可能会导致问题,以后的调用有点依赖于前一个。

让后续调用等待之前的调用完成的最佳方法是什么?或者甚至是处理先前呼叫失败的最佳方法?

我看过以下事项:

  • 使用自定义.addEventListener (Link)
  • 使用等待前一个循环的while循环已处理
  • 使用简单的if语句检查以前的语句是否需要重新运行
  • 使用其他形式的回调

现在为上下文提供一些示例代码:

this.createPath = function(){
    //if previous path segment has no length
    if (pathSegment[this.index-1].getPath().length === 0){ 
        //we need the previous path segment recreated using this same function
        pathSegment[this.index-1].createPath();
        //now we can retry this path segment again
        this.createPath();
    }
    //all is well, create this path segment using Google Maps direction service
    else {
        child.createPathLine(pathSegment[this.index-1].getEndPoint(), this.clickCoords);
    }
}

当然,这个代码会像疯了一样循环并创建许多请求。

1 个答案:

答案 0 :(得分:0)

这是 promises 的一个很好的用例。

他们的工作方式如此(使用jQuery promises的例子,但如果你不想使用jQuery,还有其他的promises API):

function doCallToGoogle() {
   var defer = $.Deferred();

   callToGoogleServicesThatTakesLong({callback: function(data) { 
        defer.resolve(data); 
   }});

   return defer.promise();
}

/* ... */
var responsePromise = doCallToGoogle();

/* later in your code, when you need to wait for the result */
responsePromise.done(function (data) {
     /* do something with the response */
});

好处是你可以链接承诺:

var newPathPromise = previousPathPromise.then(
       function (previousPath) { /* build new path */ });

看看:

总结promises是一个使用回调的对象抽象,它对控制流非常有用(链接,等待所有回调,避免大量回调嵌套)。