Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.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
Javascript 使用jQuery并行执行多个承诺后等待完成_Javascript_Jquery_Asynchronous_Callback_Deferred - Fatal编程技术网

Javascript 使用jQuery并行执行多个承诺后等待完成

Javascript 使用jQuery并行执行多个承诺后等待完成,javascript,jquery,asynchronous,callback,deferred,Javascript,Jquery,Asynchronous,Callback,Deferred,我想使用jquery的延迟/承诺实现对多个异步ajax请求进行排队: function doSomething() { console.log('doSomething')}; function makeMultiAjaxRequests1() { console.log('makeMultiAjaxRequests1')}; function makeMultiAjaxRequests2() { console.log('makeMultiAjaxRequests2

我想使用jquery的延迟/承诺实现对多个异步ajax请求进行排队:

function doSomething() {
    console.log('doSomething')};

function makeMultiAjaxRequests1() {
    console.log('makeMultiAjaxRequests1')};

function makeMultiAjaxRequests2() {
    console.log('makeMultiAjaxRequests2')};

var step1 = function () { 
    var promise = new $.Deferred().promise();   
    makeMultiAjaxRequests1(); 
    return promise; }

var step2 = function () {
    var promise = new $.Deferred().promise();
    makeMultiAjaxRequests2();
    return promise; } 

step1()
   .then(step2())
   .done(doSomething());

$.when(step1(), 
       step2())
   .done(function () {
    doSomething();
});
这是你的电话号码。所以我的问题是:


在并行执行step1和step2的模式中,代码不会到达最后一个处理程序函数。为什么?

如果您给它一个实际可以到达的URL,它确实到达了您的
done
函数(在JSFIDLE的情况下,就是
/echo/html/

基本上,您只需要这样做:

var promise = $.ajax({
    type: "GET",
    url: "/echo/html/",   //<-- instead of google     
}).promise();
var promise=$.ajax({
键入:“获取”,

url:“/echo/html/”,//您需要在步骤1和步骤2中解析
延迟的
obj

试试这个

function doSomething() {
    console.log('doSomething')};

function makeMultiAjaxRequests1(deferred) {
    console.log('makeMultiAjaxRequests1')
    deferred.resolve()};

function makeMultiAjaxRequests2(deferred) {
    console.log('makeMultiAjaxRequests2')
    deferred.resolve()};

var step1 = function () { 
    var deferred = new $.Deferred();   
    makeMultiAjaxRequests1(deferred); 
    return deferred; }

var step2 = function () {
    var deferred = new $.Deferred();
    makeMultiAjaxRequests2(deferred);
    return deferred; } 

step1().then(step2).done(doSomething);

$.when(step1(), step2()).done(function () {
    doSomething();
});

@戴伟给出了一个很好的回答

塞尔吉奥·弗莱(sergio fry)提出了一个常见的要点

如果您想采用更动态的方法,事先不知道并行运行了多少个参数,下面是JQuery(1.10+)的一个很好的扩展示例:

请参见使用动态实时示例执行的代码:


您实际在哪里解决承诺?如果您不触发处理程序,回调将不会被调用…在
step1()和
step2()中的延迟
永远无法解决。是的,这是真的,但上一个顺序示例中的情况是什么?承诺没有解决,代码仍然完成。谢谢。您的建议有一个问题:为什么不返回延迟。承诺()在步骤中。如果我们返回承诺,有什么区别?@crishushu Delay和promise都有,done方法。但是promise没有解决方法。我的问题是指顺序案例的行为(步骤1()。然后(步骤2)。完成(doSomething);)。如果我们返回延迟对象或返回其承诺,则没有区别;两者都将执行doSomething()@crishushu你是对的,在这种情况下没有区别。只想键入更少的字母。
$.whenAll = function (deferreds) {
    function isPromise(fn) {
        return fn && typeof fn.then === 'function' &&
            String($.Deferred().then) === String(fn.then);
    }
    var d = $.Deferred(),
        keys = Object.keys(deferreds),
        args = keys.map(function (k) {
            return $.Deferred(function (d) {
                var fn = deferreds[k];

                (isPromise(fn) ? fn : $.Deferred(fn))
                    .done(d.resolve)
                    .fail(function (err) { d.reject(err, k); })
                ;
            });
        });

    $.when.apply(this, args)
        .done(function () {
            var resObj = {},
                resArgs = Array.prototype.slice.call(arguments);
            resArgs.forEach(function (v, i) { resObj[keys[i]] = v; });
            d.resolve(resObj);
        })
        .fail(d.reject);

    return d;
};