我正在做一些编码,我偶然发现我不需要当().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();
当我抚慰出值之类的。因此,如果我的函数中没有一个返回承诺,那么使用时/然后或?
发布于 2014-07-30 16:12:17
如果您的代码是100%同步的,则没有理由在一般情况下使用承诺或jQuery.when()
。这样做只会使事情变得比要求的复杂和缓慢得多。
如果您想在一行中一个接一个地执行四个同步函数,只需这样调用它们。Javascript将执行第一个,当它返回时,执行第二个等等。
所以这个:
someObj.a();
someObj.b();
someObj.c();
someObj.dolast();
是一种非常精细和简单的方法,可以一个接一个地按照规定的顺序执行您的四个方法。Javascript依次执行语句。
现在,如果这些方法中的一个或多个触发了一些异步的东西(比如ajax调用),并且该方法返回了一个承诺,并且您希望在未来某个时候对ajax调用完成时对其他事情进行排序,那么您就需要一些东西,比如承诺,或者是jQuery.when()
。但是,对于100%的同步代码,没有必要通过使用承诺来使事情复杂化。
如果这些方法中的每一个都返回一个成功/错误代码(假设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"]);
发布于 2014-07-30 16:02:39
不,如果这里不使用延迟特性,并且需要按特定顺序调用一些函数,那么就这样做吧。代码过于复杂会降低其可维护性。保持简单。
https://stackoverflow.com/questions/25048766
复制相似问题