javascript promise:promise竞赛中的setTimeout问题



下面的代码输出(1(然后(3(whitch是错误的。。为什么?

以下代码将等待3秒钟并打印(3(,然后再等待1秒钟再打印(1(所以正确的顺序必须是(3(然后(1(

我想问题是wait((返回了一个新的promise,但我该如何解决这个问题注意:所有函数都必须返回"this"才能链接

class test extends Promise {
constructor(fn) {
super(fn)
return this
}
wait(seconds) {
return new test(resolve =>
setTimeout(function() {
resolve(seconds)
}, seconds * 1000)
)
}
done(fn) {
return super.then(fn)
}
}
p = new test(r => r())
p.wait(3) //(2) must be before (1)
.done(x => console.log(x))
.wait(1)
.done(x => console.log(x))

您需要wait在当前test对象(即this(上调用.then,并返回构建的Promise链:

class test extends Promise {
constructor(fn) {
super(fn)
return this
}
wait(seconds) {
return this.then(() => new test(resolve => {
setTimeout(function() {
resolve(seconds)
}, seconds * 1000);
}))
}
done(fn) {
return super.then(fn)
}
}
console.log('start');
p = new test(r => r())
p.wait(3) //(2) must be before (1)
.done(x => console.log(x))
.wait(1)
.done(x => console.log(x))

最新更新