【问题标题】:promise wait to start another function承诺等待启动另一个功能
【发布时间】:2018-11-26 16:38:39
【问题描述】:

我有一个在 Promise 下运行的函数,我想启动另一个 Promise 已解决的函数。但我不能那样做。下面是我的promise函数

var promise1
  $(document).ready(function() {
    promise1 = new Promise(function(resolve, reject) {
     getData(url).then(function(data) {
       // do something
     })
    })
  })

现在在同一页面的不同 Web 部件上,我们希望运行另一个函数,但仅在上述函数完成后

  $(document).ready(function() {
promise1.then(function(d) {
      var commentURL ="https://xxxx"
      loadComments(commentURL)
    })
})

但是第二个函数永远不会运行,请帮助我

【问题讨论】:

  • 在getData成功事件中调用promise1

标签: javascript jquery ajax promise


【解决方案1】:

当您已经从函数调用中获得承诺时,不要使用 new Promise 创建承诺,就像您使用 getData 的情况一样。将其包装在 new Promise 回调中称为 Promise constructor antipattern。尽量避免。

这样做:

var promise1;
$(document).ready(function() {
    promise1 = getData(url).then(function(data) {
        // If you want to pass something on to the next `then`, then return it here:
        return someData;
    });
});

另一部分可以保持原样:

$(document).ready(function() {
     promise1.then(function(d) {
        var commentURL ="https://xxxx"
        loadComments(commentURL)
    });
});

这只有在promise1 已被第一个代码块初始化时才有效。如果由于某种原因代码块以相反的顺序执行并且您无法更改此顺序,则在第二个代码块中包装解析承诺,如下所示:

$(document).ready(function() {
     Promise.resolve().then(function () {
         return promise1;
     }).then(function(d) {
         var commentURL ="https://xxxx"
         loadComments(commentURL)
     });
});

【讨论】:

    【解决方案2】:

    我怀疑如果您向我们提供了您的整体结构的更完整图片,我们可以建议一种更合适的方式来做您正在做的事情。

    但是回答您的实际问题:您必须立即创建承诺,而不是在 ready 回调中,而是在 ready 回调中解决它。

    如果在调用getData 之前必须等待ready,那么这是使用new Promise 的少数情况之一,即使你已经得到了getData(由于时间延迟,需要马上promise,但想等着打电话getData):

    var promise1 = new Promise(function(resolve, reject) {
      $(document).ready(function() {
         getData(url).then(resolve).catch(reject);
      });
    });
    

    但是,除非您真的必须等待 ready 调用 getData,否则不要(等待获取一些数据直到页面的 DOM完成):

    var promise1 = getData(url);
    

    【讨论】:

    • 这行得通。但是另一个函数没有执行可能是我的代码问题
    • @Milind - 对不起,我不明白你的意思。
    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2013-09-16
    • 2018-08-06
    • 2020-05-26
    相关资源
    最近更新 更多