当我解决诺言时,该函数应继续执行:
function test(){
return new Promise(resolve=>{
resolve(5)
setTimeout(()=>{console.log(7)}, 2000}
})
}
然后我调用这个函数
test().then(console.log);
所以它打印5,然后在2秒后打印7,正如我预期的那样。 但是,如果我在resolve()之后使用sync thing,它的工作方式不同:
function test(){
return new Promise(resolve=>{
resolve(5)
for(let i = 0; i < 100; i++)
console.log(i)
})
}
现在它打印0到100之间的数字,然后它打印5.但我希望它通过resolve()返回5,然后才打印所有剩下的东西。
答案 0 :(得分:1)
代码给出了预期的结果。当您立即使用5解决时,该函数尚未执行,因此它将运行其余代码。完成后,调用堆栈为空,异步then
有机会运行。两个程序之间的区别在于第二个程序立即记录,因为它不必等待函数完成执行。这是同步的。
答案 1 :(得分:-1)
我认为这与javascript&#39; s event loop有关。通过链接,您可以在JS中观看有关事件循环的精彩视频。
我不确定,但似乎异常调用resolve()
内部的内容,但是循环是同步,这就是为什么内部解析被放入queue和for循环立即执行。在&#34;正常&#34;执行过程完成后,解决它的工作,返回5。
在setTimeout
的示例中,您已将代码放入队列,但稍后(2000ms)执行。由于5没有做任何事情,所以它会立即返回(异步),2秒后你的代码就会运行。看视频。
答案 2 :(得分:-1)
我明白了。 Nodejs从左到右运行代码。 首先它给我一个函数,将resolve拒绝作为参数,然后执行这个函数。它解决了价值。然后它遇到同步for循环,因此它必须执行它同步。然后它返回一个已解决的promise,然后我将应用方法。 then()在解析promise时执行回调。它已经解决了。它打印出我已解决的价值 如果使用回调,则会有所不同:
Address
首先是打印(7),然后是所有剩下的数字 但它只有在你知道回调将被调用一次时才有效。否则,它将打破逻辑。
答案 3 :(得分:-2)
所以,我想确保我们在同一页面上的一些事情。您的test
函数的setTimeout
是异步的。是的,它在一个承诺中,但你已经以不受控制的方式将它发送到事件循环。
setTimeout(()=>{console.log(7)}, 2000} //not controlled in your first function
无论你在resolve
中放置什么,都是唯一受到承诺控制的东西。您使用承诺的方式不是它们应该如何使用。如果这让你感到困惑,你可能不得不回到基础并再读一遍。
编辑:我似乎没有正确表达自己,因此获得了相当多的盐。更好的解释:
您应该对promise
如何处理退货声明。除单个resolve
语句外,promise函数不应执行任何其他输出操作。然后可以在另一个功能中的后续操作中同步控制它。关键词是另一个。
function test(){
return new Promise(resolve=>{
resolve(5)
})
}
function loopTest() {
test().then( (num) => {
console.log(num)
for (let i = 0; i < 10; i++) {
console.log(i)
}
})
} // what you were trying to actually accomplish
loopTest()