承诺解决混乱

时间:2017-10-13 19:00:58

标签: javascript asynchronous promise

当我解决诺言时,该函数应继续执行:

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,然后才打印所有剩下的东西。

4 个答案:

答案 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()