将JQuery promises推送到数组中异步执行延迟函数

时间:2014-07-29 19:28:08

标签: jquery arrays asynchronous promise deferred

我正在尝试理解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. testDeferred testDeferred2 promises推入数组“promises”,迫使他们解析。
  2. 使用 $。when.apply。
  3. 执行这两项操作

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

    我故意删除了以 testDeferred 结尾的“.promise()”来测试我是应该返回一个promise还是只是deferred。同样的事情发生了。

    拜托,我需要一些帮助......提前致谢。

1 个答案:

答案 0 :(得分:2)

  

这两个函数都是在我推动它们的时刻执行的

是的,这就是你在这里做的事情:

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