2017-10-13 57 views
-1

当我解决的承诺,该功能应继续执行:无极分辨混淆

function test(){ 
    return new Promise(resolve=>{ 
     resolve(5) 
     setTimeout(()=>{console.log(7)}, 2000} 
    }) 
} 

然后,我调用这样

test().then(console.log); 

所以它打印5的功能,再经过2秒,它打印7,如我所料。 但是,如果我有同步的事情工作的决心(后),它的工作方式不同:

function test(){ 
    return new Promise(resolve=>{ 
     resolve(5) 
     for(let i = 0; i < 100; i++) 
      console.log(i) 
    }) 
} 

现在,它输出数字从0到100,然后它打印5.但是我预期经过决心重返5()然后才打印所有剩下的东西。

+0

不可以。你应该做'return resolve(5)',之后你什么都不做。否则,你为什么解决...... – yBrodsky

+0

@yBrodsky不正确。您可以使用解析而不显式返回它。 '返回'唯一重要的是'新的承诺'。 – Andrew

+0

关键字应该是。任何你想在解决之后继续做的事情的实例,在承诺之内? – yBrodsky

回答

-2

所以,我想确保我们在同一页面上的一些事情。您的test函数的setTimeout是异步的。是的,它在承诺之内,但你已经以不受控制的方式将它发送到事件循环。

setTimeout(()=>{console.log(7)}, 2000} //not controlled in your first function

无论你在resolve的地方就在于得到由承诺所控制的唯一的事情。你使用诺言的方式不是它们应该如何使用。如果这会让你感到困惑,你可能不得不回到基础知识并阅读更多内容。

编辑:我似乎没有明确表达自己,因此获得了相当多的盐。更好的解释:

你应该对待promise你将如何返回语句。除了单个resolve语句外,承诺函数不应执行任何其他输出操作。然后可以在后续操作中同步控制另一个函数。关键词是另一个。

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() 
+0

谢谢。但是,抱歉,我没有完全明白你在'不受控制的'下面说什么 –

+0

@FureturPhyarell已更新 – Andrew

-1

我认为这与javascript的event loop有关。通过链接,您可以观看有关JS中事件循环的精彩视频。 我不确定,但看起来resolve()里面的内容是异步调用的,但for循环是同步的,这就是为什么里面的resolve被放入队列并且for循环立即执行。在“正常”执行过程完成后,解析它是否工作,返回5.

setTimeout的示例中,您已将代码放入队列中,但稍后(2000毫秒)执行。由于5没有做任何事情,它立即返回(不同步),2秒后代码运行。 Wath的视频。

1

该代码给出了预期的结果。当你立即用5解析时,函数还没有完成执行,所以它运行了其余的代码。一旦完成,调用堆栈就是空的,并且异步的then有机会运行。两个程序之间的区别在于第二个程序立即记录,因为它不必等待函数完成执行。它是同步的。

-1

我想通了。 Nodejs从左至右运行代码。 首先它给了我一个决定拒绝作为参数的函数,然后它执行这个函数。它解决了价值。然后它遇到一个同步循环,因此它必须执行同步。然后它返回已经解决的承诺,然后我应用方法。然后()在promise被解析时执行回调。它已经解决了。它打印我的解析值 如果你使用回调会有所不同:

function test(callback){ 
    callback(7) 
    for(let i = 0; i<100; i++){ 
     console.log(i) 
    } 
} 

它会首先,打印(7)才把所有其余的号码 但如果你知道它只能回调会被调用一次。否则,它会打破逻辑。

+1

很明显,因为回调是同步的,承诺是异步实现的。但是这并不能回答你的问题 - 为什么它首先循环,然后解决承诺。 – aprok

+0

这样做,因为现在我知道存在的差异,因为承诺的执行 –

+0

也许现在我只需要谷歌如何承诺 –