gpt4 book ai didi

javascript - jQuery JavaScript 嵌套异步函数回调

转载 作者:行者123 更新时间:2023-12-01 02:33:52 26 4
gpt4 key购买 nike

我有点困惑如何确定从另一个函数多次调用的异步函数何时完成最后一次迭代的调用:

function MainAsyncFunction(callback) {
for (var i = 0; i < 10; i++) {
SubAsyncFunction(function(success) {
if (i >= 10 && success) { // THIS IS WRONG?!
callback(true); // happens too early
}
});
}
};

function SubAsyncFunction(callback) {
SubSubAsyncFunction(function() {
callback(true);
});
}

我正在做的是调用 Google Distance Matrix service ,其目的地限制为 25 个,因此我必须拆分目的地数组才能多次调用此服务,但我不知道它何时完成。

在代码的主要部分中,我可以看出,MainAsyncFunction 中循环的第二次迭代在回调时尚未完成。

我认为我的问题是在处理 JavaScript 中的异步函数时我没有弄清楚事件的顺序...请解释一下该主题通常是如何实现的。

最佳答案

您可以使用 jQuery Deferred对象,充当表示异步操作状态的 token 。

以下是一个简化的示例:

//set up your sub method so that it returns a Deferred object
function doSomethingAsync() {
var token = $.Deferred();
myAsyncMethodThatTakesACallback(function() {
//resolve the token once the async operation is complete
token.resolve();
});
return token.promise();
};

//then keep a record of the tokens from the main function
function doSomethingAfterAllSubTasks() {
var tokens = [];
for (var i=0; i < 100; i++) {
//store all the returned tokens
tokens.push(doSomethingAsync());
}

$.when.apply($,tokens)
.then(function() {
//once ALL the sub operations are completed, this callback will be invoked
alert("all async calls completed");
});
};

以下是OP更新代码的更新版本:

function MainAsyncFunction(callback) {
var subFunctionTokens = [];
for (var i = 0; i < 10; i++) {
subFunctionTokens.push(SubAsyncFunction());
}

$.when.apply($,subFunctionTokens)
.then(function() {
callback(true);
});
};

function SubAsyncFunction() {
var token = $.Deferred();
SubSubAsyncFunction(function() {
token.resolve();
});
return token.promise();
};​

关于javascript - jQuery JavaScript 嵌套异步函数回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9926624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com