我正在做一些编码并且遇到了这个并且我意识到我不需要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或者使用时是否重要?
答案 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"]);