Jquery “如何拥有第一个功能”;foo1();在运行$之前已完成处理。之后运行$when()时??
我正在使用jqueryv2.0.0 如何使这些函数以自上而下的顺序运行,而不是像异步那样的效果或顺序,这意味着在函数“foo1()”首先完成之前不要让函数“foo2()”运行Jquery “如何拥有第一个功能”;foo1();在运行$之前已完成处理。之后运行$when()时??,jquery,jquery-deferred,deferred,.when,Jquery,Jquery Deferred,Deferred,.when,我正在使用jqueryv2.0.0 如何使这些函数以自上而下的顺序运行,而不是像异步那样的效果或顺序,这意味着在函数“foo1()”首先完成之前不要让函数“foo2()”运行 foo1(); $.when( foo2() ) .done(function() { $('#test').dialog('close'); foo3(); }) .fail(function() { alert('You have a problem!!'); foo3(); }); 谢谢…假设
foo1();
$.when( foo2() )
.done(function() { $('#test').dialog('close'); foo3(); })
.fail(function() { alert('You have a problem!!'); foo3(); });
谢谢…假设
foo1
看起来像这样:
function foo1() {
var promise = $.Deferred();
$.ajax({...}).done(function() { promise.resolve(); })
.fail(function() { promise.reject(); });
return promise;
}
foo1().done(function() {
foo2()
.done(function() { $('#test').dialog('close'); foo3(); })
.fail(function() { alert('You have a problem!!'); foo3(); });
});
您可以这样做:
foo1().done(function() {
$.when( foo2() )
.done(function() { $('#test').dialog('close'); foo3(); })
.fail(function() { alert('You have a problem!!'); foo3(); });
});
…或者像@Kevin B提到的那样:
function foo1() {
var promise = $.Deferred();
$.ajax({...}).done(function() { promise.resolve(); })
.fail(function() { promise.reject(); });
return promise;
}
foo1().done(function() {
foo2()
.done(function() { $('#test').dialog('close'); foo3(); })
.fail(function() { alert('You have a problem!!'); foo3(); });
});
…但正如评论所指出的那样,foo1
的更好实现是这样的,只要foo1
在done
、fail
或始终
期间不需要做任何自定义工作,您就可以这样做
function foo1() {
return $.ajax({...});
}
否则,如果
foo1
在任何方面都不是异步的,它将始终首先完成 在foo1()上使用.done,假设foo1()返回承诺对象。另外,当不需要时,可以执行foo2().done,也可以假设foo2()返回一个promise对象。如果两个函数都不返回promise对象,那么您的代码将无法工作。@fletchsod“如果foo1在任何方面都不异步,它将始终首先完成。”function foo1(){return$.ajax()}
和foo2().done(…)
简化代码以澄清A.Wolff所说的:$.ajax
已经是延迟的,因此,没有理由将其包装在另一个延迟中。此外,foo1
中的promise
变量。这真的是一种拖延,而不是一种承诺。两者的区别在于延期可以取消,承诺不能取消(只读)。您可以通过对延迟调用.promise()
方法来创建只读版本。此外,接受的答案是使用嵌套回调来控制序列。虽然这是可行的,但它缺少了使用延迟的一个主要好处:避免回调地狱。