我有一个与Google地图上的鼠标点击事件绑定的功能。由于功能的性质,处理完成可能需要一些时间(.1秒 - 2秒,具体取决于连接速度)。本身并不是一个问题,但如果用户点击满意,这可能会导致问题,以后的调用有点依赖于前一个。
让后续调用等待之前的调用完成的最佳方法是什么?或者甚至是处理先前呼叫失败的最佳方法?
我看过以下事项:
.addEventListener
(Link) 现在为上下文提供一些示例代码:
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);
}
}
当然,这个代码会像疯了一样循环并创建许多请求。
答案 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是一个使用回调的对象抽象,它对控制流非常有用(链接,等待所有回调,避免大量回调嵌套)。