Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有一种方法可以保证“承诺”。所有的“承诺”都是在“然后”内在承诺链之后解决的?_Javascript_Promise - Fatal编程技术网

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();
})