我有一个简单的承诺:
function p(l) {
return new Promise(function(resolve) {
alert(l);
resolve();
});
}
然后我尝试创建一个仅在它的then子句后解析的承诺:
function pp(l1, l2) {
return new Promise(function(resolve) {
p(l1).then(() => {
alert(l2);
resolve();
});
});
}
我现在这样做:
p('start').then(pp('A', 'B')).then(p('end'));
我希望看到:开始,A,B,结束
但相反,我看到:开始,A,结束,B
为什么?
我怎样才能实现我想要的,创造一个承诺(pp),当它的子句完成后会解决?
答案 0 :(得分:0)
在你的第二个功能中试试
function pp(l1, l2) {
return new Promise(function(resolve) {
alert(l1);
alert(l2);
resolve();
});
}
或者,如果您想将p
功能放在pp
内,那么
function pp(l1, l2) {
return p(l1).then(() => {
alert(l2);
});
}
p('start').then(() => pp('A', 'B')).then(() => p('end'));
答案 1 :(得分:0)
pp
可以更简单地编码:
function pp(l1, l2) {
return p(l1).then(() => {
alert(l2);
});
}
这是承诺的全部要点,如果你每次都必须编写复杂的代码,那就不值得:)
此外,.then
期望函数回调,其中in参数是前一个promise / function的返回值。
p('start').then(() => pp('A', 'B')).then(() => p('end'));
至于你行为的确切原因,除了不使用.then
链接之外,我不清楚原因。
此代码工作的原因是,在回调中返回Promise
时,执行Promise
,并将其解析为的值作为参数传递给下一个回调。 () => pp('A', 'B')
等同于() => { return pp('A', 'B');}
,pp
会在调用链的下一个回调之前返回并等待。
如果您希望保持相同的.then
调用语法,那么更改pp
以返回回调而不是Promise
会起作用:
function pp(l1, l2) {
return () => p(l1).then(() => {
alert(l2);
});
}
但是你不能再将其用作Promise
。链接的最后一部分仍需要更改:.then(() => p('end'))
。
答案 2 :(得分:0)
来自mdn - “onFulfilled:函数在Promise完成时调用。此函数有一个参数,即履行价值。”
我的代码问题在于then(pp('A', 'B'))
我传递了then
一个值(pp()的结果是一个承诺)而不是 function (一个接收调用promise的履行值的函数)
所以正确的使用方法是始终传递一个函数:
function p(l) {
return new Promise(function(resolve) {
alert(l);
resolve();
})
}
function pp(l1, l2) {
return p(l1).then(() => p(l2));
}
p('start').then(() => pp('A', 'B')).then(() => p('end'));