我有在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)
})
})
但是第二功能永远无法运行,请帮助我
答案 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)
});
});