gpt4 book ai didi

javascript - jQuery.when 的后期绑定(bind)

转载 作者:行者123 更新时间:2023-11-30 12:53:09 26 4
gpt4 key购买 nike

我正在使用一个使用 jQuery Deferred Objects 的框架.

在我的代码中,一个异步操作应该成功执行,以便执行另一个异步操作。

function doOperation() {

var def2mock = $.Deferred();
var def1 = doSomeAsyncOperation().done(function () {
var def2 = doAnotherAsyncOperation();
});

return $.when(def1, def2mock);
}

所以我将对第二个操作的调用放在第一个操作的延迟的“完成” promise 中,如示例中所示。现在,我用函数 doOperation 包装这个序列。 doOperation 的结果应该是两个异步调用的两个 deferred 的连接。意思是 doOperation 如果所有异步操作都成功则成功,如果其中任何一个失败则失败,这正是 $.when

问题 是为了创建与 $.when 的连接,我需要在 $.when 时出现两个延迟叫做。并且因为当时第二个异步操作的延迟不可用,所以我不得不想办法先创建连接,然后将第二个异步操作的延迟添加到连接稍后

为此,我想我可以在 doOperation 中定义一个名为 def2 的新 mock $.Deferred .当真实的 def2 准备就绪时,我可以通过某种方式链接真实的延迟到模拟的,即让真实的与模拟的同步它的状态。我找到的唯一方法是做

def2.done(def2mock.resolve)
// and
def2.fail(def2mock.reject)

但我不认为这种手动链接是正确的方法。

所以,如果您有更好的建议,请告诉我如何以正确的方式做到这一点。

最佳答案

And when the real def2 is ready, I can somehow link the real deferred to the mock one, i.e. make the real one synchronize its state with mock one.

这实际上就是.then做:它返回一个新的 promise ,当从传递的回调返回的 promise 被解决/拒绝时,它被解决/拒绝。

为了使它与 $.when 一起工作,您必须保留对原始 promise 的引用:

function doOperation() {
var def1 = doSomeAsyncOperation();
var def2 = def1.then(function () {
return doAnotherAsyncOperation();
});
return $.when(def1, def2);
}

DEMO

def2 将在回调返回的 promise 得到解决时得到解决,即 doAnotherAsyncOperation 返回的 promise 。


但从概念的 Angular 来看,我认为在这里使用 $.when 不是一个好的选择。您实际上是在顺序执行两个异步函数,但是$.when用于并行运行异步函数。

我会通过 .then 链接函数调用并收集响应:

function doOperation() {
return doSomeAsyncOperation().then(function (resp1) {
return doAnotherAsyncOperation().then(function(resp2) {
return [resp1, resp2];
});
});
}

DEMO

我会说这里更清楚 doAnotherAsyncOperation 是在 doSomeAsyncOperation 之后执行的,并且这两个调用的结果可供 doOperation 的调用者使用.

对于失败情况,您可能必须执行类似的操作。

关于javascript - jQuery.when 的后期绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20278033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com