Javascript 有没有一种方法可以保证“承诺”。所有的“承诺”都是在“然后”内在承诺链之后解决的?
有没有办法保证Javascript 有没有一种方法可以保证“承诺”。所有的“承诺”都是在“然后”内在承诺链之后解决的?,javascript,promise,Javascript,Promise,有没有办法保证承诺。所有的都在之后解决,然后内部承诺链 例如: const promiseOne = new Promise((resolve, reject) => { setTimeout(function(){ console.log('promiseOne after 1 second') resolve() }, 1000) }).then(()=> { setTimeout(function(){ console.log('promis
承诺。所有的都在之后解决,然后内部承诺链
例如:
const promiseOne = new Promise((resolve, reject) => {
setTimeout(function(){
console.log('promiseOne after 1 second')
resolve()
}, 1000)
}).then(()=> {
setTimeout(function(){
console.log('promiseOne then chain, after 2 seconds')
}, 1000)
})
Promise.all([promiseOne])
.then(() => {
console.log('Promise.all then chain after 1 second')
})
日志:
then
s以正确的顺序运行,但第一个只是设置超时,因此console.log
s以与then
s相反的顺序运行。如果要在继续链之前等待超时运行,则需要使用从该返回的附加承诺,然后:
const promiseOne=新承诺((解决、拒绝)=>{
setTimeout(函数(){
console.log('promiseOne after 1秒')
解决()
}, 1000)
}).然后(()=>新承诺((决定,拒绝)=>{
setTimeout(函数(){
log('promiseOne then chain,2秒后')
解决()
}, 1000)
})
)
承诺所有人([承诺人])
.然后(()=>{
log('Promise.all then chain after 1秒')
})
最简单的方法是通过上一个返回的承诺,然后通过你已经在做的。如果您在第一个中获取控制台日志,然后从设置超时中取出,您将看到它正按照您想要的顺序执行
它按该顺序记录的原因是setTimeout
是异步的
试着这样做:
const promiseOne = new Promise((resolve, reject) => {
setTimeout(function(){
console.log('promiseOne after 1 second')
resolve()
}, 1000)
}).then(()=> new Promise(resolve => {
setTimeout(function(){
console.log('promiseOne then chain, after 2 seconds')
resolve()
}, 1000)
})
通过让第一个然后
返回一个承诺,它将一直等到设置超时后
,并按照正确的顺序继续
编辑:作为奖励,当使用setTimeout
s时,此帮助程序非常有用:
const wait = ms => () => new Promise(resolve => setTimeout(resolve,ms));
您可以这样使用:
Promise.resolve()
.then(wait(2000))
.then(() => {
doSomething();
})
你必须在内心承诺的链条中返回一个新的承诺:
const promiseOne=新承诺((解决、拒绝)=>{
setTimeout(函数(){
console.log('promiseOne after 1秒')
解决();
}, 1000)
}).然后(()=>{
返回新承诺((解决、拒绝)=>{
setTimeout(函数(){
console.log('promiseOne then chain,2秒后');
解决();
}, 1000)
});
})
承诺所有人([承诺人])
.然后(()=>{
log('Promise.all then chain after 1秒')
})
在“promiseOne then chain,2秒后”回调中,返回另一个在1秒后解析的承诺。现在您的回调返回未定义。这就是承诺。所有的承诺都是这样的,用它来做一个承诺是多余的,不管你的答案是什么。叹气真不敢相信我没有注意到
Promise.resolve()
.then(wait(2000))
.then(() => {
doSomething();
})