【问题标题】:Wait for an asynchronous method inside a synchronous method?等待同步方法中的异步方法?
【发布时间】:2018-11-01 15:51:44
【问题描述】:

情况如下:

我有2个JS函数,我需要等待这2个方法来做其他事情。
所以我写了:

$.when(foo1(), foo2()).done(function () {
    //do something
});

这很好用。

但是,在某些情况下,foo2() 必须在我的 DOM 中加载部分视图:

function foo2() {
    $("#bar").load('/controller/action')
}

似乎.done 回调中的代码在foo1()foo2() 的末尾执行而局部视图没有完全加载

我怎样才能对foo2()说等待部分视图加载结束,然后才说“好的,我完成了我的工作,你可以继续”?

【问题讨论】:

    标签: javascript jquery asynchronous jquery-deferred deferred


    【解决方案1】:

    很遗憾,load() 没有返回承诺或延迟对象。相反,要完成这项工作,您可以从 foo2() 手动返回一个延迟对象,您可以在 load() 完成后解析该对象。像这样的:

    function foo2() {
      var deferred = $.Deferred()
      $("#bar").load('/controller/action', function() {
        deferred.resolve();
      });
      return deferred;
    }
    

    【讨论】:

    • 为了未来的证明,由于 ECMA 已经弃用 var defer = Promise.defer() 语法(我想 jQuery 最终会效仿),使用正确的 Promise 语法可能会更好:function foo2() { return new Promise((resolve, reject) => { $("#bar").load('/controller/action', () => { resolve(); }); }); };
    • 好像可以了,谢谢!我会尝试@Jpec07 语法来检查一下
    • @Jpec07 完全取决于所需的浏览器支持。 IE 11 不支持 Promise。IE11 绝对不支持箭头函数。
    • 很高兴知道。快速搜索显示 IE11 的生命周期与 Windows 7 相关联,微软将在 2020 年削减对它的支持。所以在那之前,$.Deferred() 似乎是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多