Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery “如何拥有第一个功能”;foo1();在运行$之前已完成处理。之后运行$when()时??_Jquery_Jquery Deferred_Deferred_.when - Fatal编程技术网

Jquery “如何拥有第一个功能”;foo1();在运行$之前已完成处理。之后运行$when()时??

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(); }); 谢谢…假设

我正在使用jqueryv2.0.0

如何使这些函数以自上而下的顺序运行,而不是像异步那样的效果或顺序,这意味着在函数“foo1()”首先完成之前不要让函数“foo2()”运行

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()
方法来创建只读版本。此外,接受的答案是使用嵌套回调来控制序列。虽然这是可行的,但它缺少了使用延迟的一个主要好处:避免回调地狱。