Jquery .when()。then()或直接函数调用。有何不同?

时间:2014-07-30 23:44:12

标签: jquery

我正在做一些编码并且遇到了这个并且我意识到我不需要when()。then(),但好奇如果它在这种情况下会有用......

var someObj = function(){

  var k = {
     a: function(){ 
           // do something 
     },
     b: function(){ 
        // do something
     },
     c: function(){ 
       // do something
     },

     dolast: function(){
        // something that needs to happen last
     }
 }
 return k;

}();

所以,因为我希望dolast()最后开始,我想做:

jQuery.when(
        (function(){
           someObj.a();
           someObj.b();
           someObj.c();
          })() 
        ).then(
          someObj.dolast();
        )

这与此完全相同:

   someObj.a();
   someObj.b();
   someObj.c();
   someObj.dolast();

当我安排值等等。所以,如果我的函数都没有返回promise,那么在/ then或者使用时是否重要?

2 个答案:

答案 0 :(得分:2)

不,如果您不在此处使用延迟功能,并且您需要按特定顺序调用某些功能 - 只需执行此操作即可。代码过于复杂会降低其可维护性。 Keep it simple

答案 1 :(得分:1)

如果您的代码是100%同步的话,没有理由一般使用promises或jQuery.when()。要做到这一点,只会让事情变得更加复杂,而且速度要慢得多。

如果要一个接一个地连续执行四个同步函数,只需按此方式调用它们即可。 Javascript将执行第一个,当它返回时,执行第二个,依此类推。

所以这个:

someObj.a();
someObj.b();
someObj.c();
someObj.dolast();

是一种完美而简单的方法,可以一个接一个地按照规定的顺序执行四种方法。 Javascript一个接一个地执行语句。

现在,如果这些方法中的一个或多个触发了异步的东西(比如ajax调用),并且该方法返回了一个promise,并且你希望对ajax调用在将来的某个时间完成时的其他事情进行排序,那么你需要承诺和jQuery.when()之类的东西。但是,对于100%同步代码,没有必要通过使用promises来使问题复杂化。


如果这些方法中的每一个都返回成功/错误代码(假设0成功),并且您希望只有在成功的情况下继续进行其余操作,那么您可以执行以下操作:

function runSequence(obj) {
     var err;
     if ((err = obj.a()) !== 0) return err;
     if ((err = obj.b()) !== 0) return err;
     if ((err = obj.c()) !== 0) return err;
     return obj.doLast();
}

或者,如果您将方法编码为在失败时抛出异常,则可以执行以下操作:

function runSequence(obj) {
    try {
        someObj.a();
        someObj.b();
        someObj.c();
        someObj.dolast();
        return 0;
    } catch(e) {
        return e;
    }
}

或者,使用数据驱动的方法:

function runSequence(obj, arrayOfMethods) {
    var err;
    for (var i = 0; i < arrayOfMethods.length; i++) {
        err = obj[arrayOfMethods[i]]();
        if (err !== 0) return err;
    }
    return 0;
}

runSequence(someObj, ["a", "b", "c", "doLast"]);