2017-10-13 60 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

也許現在我只需要谷歌如何承諾 –