【问题标题】:Jquery - Chain functions with deferred and promises but without setTimeoutJquery - 具有延迟和承诺但没有 setTimeout 的链函数
【发布时间】:2016-08-23 12:16:28
【问题描述】:

我需要一个接一个地执行 2 个函数,函数“A”中的内容在函数“B”中的内容执行之前完全完成...

我找不到不使用 setTimeout 的示例……这很奇怪……

我有以下示例(from here),它应该工作吗?我如何测试它是否有效?我可以用什么虚拟代码来模拟“//用 SharePoint JSOM 做事”这部分需要 5 秒到 30 秒,比如说。

var a = function() {
var defer = $.Deferred();

//do stuff with SharePoint JSOM

console.log('a() called');

return defer;
};

var b = function() {
var defer = $.Deferred();

console.log('b() called');


return defer;
};



a().then(b);

【问题讨论】:

  • 是的,只需将setTimeout 用作假人。
  • 如果b 不做任何异步操作,它不应该返回延迟(或承诺)。 then 也适用于同步回调。
  • 根据我测试和阅读的内容,您不能将 setTimeout 用作虚拟对象,因为它根本不会停止调用代码。而且我不能使用预设延迟。
  • 是的,延迟或 JSOM 也不会停止调用代码,这就是它们的重点。
  • 嗨,我不是说完全停止代码。只需暂停函数 B 的执行,直到函数 A 执行,(不使用 setTimeout ),你是说这不是 Jquery deferred/promises 的预期目的吗?

标签: javascript jquery promise jquery-deferred


【解决方案1】:

简单地使用promisevanilla JS)并将它们与then链接起来。

function a() {
    return new Promise(function(resolve) {
        console.log("wait two seconds ...");

        // this timeout is only here for demo purpose ;)
        setTimeout(function() {
            console.log("A");
            resolve();
        }, 2000);
    });
}

function b() {
    console.log("B");
}

a().then(b);

如果你想使用 jQuery deffered 几乎一样。

function a() {
    var defer = $.Deferred();
    
    console.log("wait two seconds ...");

    // this timeout is only here for demo purpose ;)
    setTimeout(function() {
        console.log("A");
        defer.resolve();
    }, 2000);
    
    return defer;
}

function b() {
    console.log("B");
}

a().then(b);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

  • 嗨,我知道这种方式,但只是想获得一个使用 jquery 承诺的工作示例......
  • 但是 setTimeout 不能修复 2000 毫秒的设置超时吗?我不想要一个固定的超时。我希望 B 在 A 自然完成时执行。
  • setTimeout 仅作为示例。您可以完全删除它。 ;) 见这里:jsfiddle.net/cxcrk8vr@Zertix.net
  • OK ,所以你说的是 defer.resolve();在 setTimeout 语句之外,它仍然会等待所有东西(函数等)完成,只要 defer.resolve();是最后一行吗?我无法测试它,因为我没有一些可以自行运行几秒钟的虚拟函数..
  • @Zertix.net 好吧,不,因为您仍然希望 .resolve() 只有在您执行的任何操作完成后才执行,这将需要某种回调(就像 setTimeout 一样)。承诺不会避免回调的需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 2023-03-21
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
相关资源
最近更新 更多