【问题标题】:Pushing JQuery promises into array executes deferred functions Asynchronously将 JQuery 承诺推送到数组中异步执行延迟函数
【发布时间】:2014-09-21 07:18:26
【问题描述】:

我正在尝试理解 Javascript 延迟函数。我在使用 JQuery Mobile 开发的移动应用程序中遇到了一个问题。

我已经用示例创建了JSFiddle,但为了清楚起见,我将代码粘贴在这里。

var promises = [];

function out() {
    var args = Array.prototype.slice.call(arguments, 0);
    document.getElementById('output').innerHTML += args.join(" ") + "\n";
}

function testDeferred(a) {
    return $.Deferred(function (d) {
        if (a == 1) {
            d.resolve(a);
        } else {
            d.reject(a);
        }
    });
}

function testDeferred2(a) {
    var deferred = new $.Deferred();

    if (a == 1) {
        deferred.resolve(a);
    } else {
        deferred.reject(a);
    }
    return deferred.promise();
}


promises.push(testDeferred(1));
promises.push(testDeferred2(1));

out(promises[0].state());
out(promises[1].state());

$.when.apply($, promises)
    .done(function () {
    out("Done");
});

我的意图:

  1. testDeferredtestDeferred2 承诺都推入数组“承诺”,强制它们解决。
  2. 同时使用 $.when.apply. 执行

我实现的是在我推送它们的那一刻执行这两个功能。证明是他们在推动他们成为“解决”后的状态。

我删除了以 testDeferred 结尾的“.promise()”,目的是测试我是否应该返回一个承诺或只是延迟。同样的事情发生了。

拜托,我需要一些帮助...在此先感谢。

【问题讨论】:

  • 我很困惑。可能是因为你糊涂了。 :) 到目前为止,您所描述的正是应该发生的事情。当您创建延迟对象时,您会立即解决它,因此它们处于数组中的已解决或拒绝状态,等待您传递给 .when。将整个延迟对象或仅将承诺作为返回值传递并没有什么区别,因为承诺对象和延迟对象都有一个承诺方法。

标签: jquery arrays asynchronous promise deferred


【解决方案1】:

这两个函数在我推送它们的那一刻都在执行

是的,这就是你在这里所做的:

promises.push(testDeferred(1));
promises.push(testDeferred2(1));

您正在调用函数,这将返回已解决的承诺(或延迟,就此而言)。但是,您需要区分 执行 函数和 解析 承诺。

您的代码会同步执行此操作,这很不寻常,通常您希望立即执行函数并稍后解决返回的承诺:
在编写异步代码时(想象一下测试函数中的setTimeout$.ajax),然后您会立即调用它们,这会立即启动异步任务,但会等待 /em> 承诺他们的结果。

function testDeferredDelay(a, ms) {
    var deferred = new $.Deferred();
    setTimeout(function() { // happens now
        deferred.resolve(a); // happens later
    }, ms);
    return deferred.promise(); // happens now
}

promises.push(testDeferredDelay(1, 50));
promises.push(testDeferredDelay(2, 100));

out(promises[0].state()); // pending
out(promises[1].state()); // pending

$.when.apply($, promises) // happens now
.done(function () {
    out("Done"); // happens later
});

(updated demo fiddle)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2021-01-22
    • 2015-03-27
    • 2023-03-21
    • 1970-01-01
    • 2018-11-03
    相关资源
    最近更新 更多