承诺等待启动另一个功能

时间:2018-11-26 08:18:30

标签: javascript jquery ajax 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)
    })
})

但是第二功能永远无法运行,请帮助我

2 个答案:

答案 0 :(得分:0)

我怀疑您是否能对我们的整体结构有一个更完整的了解,我们可以建议一种做您正在做的事情的方法,这样会更合适。

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

如果,您必须在致电ready之前等待getData,这是一种罕见的情况,即使使用new Promise也很有意义您已经从getData获得了承诺(由于时间延迟,您需要立即做出承诺,但是您想等待呼叫getData):

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

但是,除非您确实需要等待ready来调用getData,否则请不要(等待获取一些数据直到页面的DOM已完成):

var promise1 = getData(url);

答案 1 :(得分:0)

当您已经从函数调用中获得承诺时,不要使用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)
     });
});