我知道这个问题已被多次询问,但我似乎无法使用我的代码获得解决方案:Wait till a Function with animations is finished until running another Function,jquery wait for multiple complete events,Wait for the end of TWO asynchrounous functions before firing a third (jQuery Deferred ?)
基本上,我想连续调用四个函数:
#1
function getJason() {
$.getJSON(rgUrl1,function(json1){
rgJson1 = json1; ...etc.
});
#2
function combineJason() {
//code to combine
});
#3
function divideArray() {
//code to divide stuff
});
#4
function doOtherStuff() {
//code to do some other stuff
});
我需要#1在调用#2之前完成,#2在#3之前完成,#3在#4之前完成。过去的帖子让我相信我应该使用延迟和承诺。我已阅读文档http://api.jquery.com/category/deferred-object/并尝试了一些示例但没有成功:
function testing() {
var deferredObj = $.Deferred();
var test = getJson()
var function1 = function () {
test.done(function(){
deferredObj.resolve();
return deferredObj;
});
}
deferredObj.done(function(){
combineJson();
});
};
此外,大多数示例涉及两个函数,而我需要调用几个函数。我也注意到一些回复包含“setTimeout”。关于使用带有定时器或暂停或延迟的任何东西,我有点怀疑,也许是不必要的。我不会想到这个函数需要多长时间。如果一个用户的计算机/连接速度较慢或者什么?
答案 0 :(得分:3)
jQuery的ajax函数已经返回了一个promise。因此,如果使用jquery的ajax函数,则不需要创建新的延迟对象。
要连续调用您的函数:调用.then
方法,无论您需要调用多少函数。如果您的一个或多个函数需要执行某些异步任务然后只返回一个promise,则延迟对象将等待调用下一个then
回调,直到返回的promise解析为止。每个then
回调都将传递前一个then
中返回的数据(或者在返回的承诺的情况下传递已解析的数据)
$.getJSON(rgUrl1,function(json1){
rgJson1 = json1; ...etc.
}).then(combineJason)
.then(divideArray)
.then(doOtherStuff);
//#2
function combineJason(someData) {
//code to combine
return $.getJSON("url to some other json endpoint");
}
//#3
function divideArray(someData) {
//code to divide stuff
//this function is sync so just return some data
return someNewData;
}
//#4
function doOtherStuff(someData) {
//code to do some other stuff
//this function is async so return a promise;
return $.getJSON("url to some other json endpoint");
}
答案 1 :(得分:2)
连续调用它们非常简单,你不需要等待多个异步事物,而只需要等待前一个事件。
你要做
function getJason() {
return $.getJSON(rgUrl1);
}
function combineJason(json1) {
//code to combine
}
function divideArray() {
//code to divide stuff
}
function doOtherStuff() {
//code to do some other stuff
}
getJason().then(combineJason).then(divideArray).then(doOtherStuff);
与
非常相似doOtherStuff(divideArray(combineJason(getJason())));
如果一个结果是异步的(在这里,$.getJSON
中的getJason
),它只会延迟计算(作为回调)。