连续调用多个函数

时间:2014-12-20 18:58:14

标签: javascript jquery function

我知道这个问题已被多次询问,但我似乎无法使用我的代码获得解决方案:Wait till a Function with animations is finished until running another Functionjquery wait for multiple complete eventsWait 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”。关于使用带有定时器或暂停或延迟的任何东西,我有点怀疑,也许是不必要的。我不会想到这个函数需要多长时间。如果一个用户的计算机/连接速度较慢或者什么?

2 个答案:

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

JSFiddle Demostrating mixed async/sync succession

答案 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),它只会延迟计算(作为回调)。