2017-03-08 19 views
0

我讀this article我伸手這段代碼:試圖找出承諾在JavaScript

const wait = time => new Promise((resolve) => setTimeout(resolve, time)); 
wait(3000).then(() => console.log('Hello!')); // 'Hello!' 

不幸的是,這個例子並沒有真正幫助我理解大家承諾的這種權力在談論。我想知道什麼是上面的代碼之間的差異,這一個 -

setTimeout(() => { console.log('Hello!'); },3000); 
+2

區別在於,第一個代碼返回一個承諾,並且可用於承諾鏈 –

回答

1

有你展示兩個例子之間沒有功能上的區別 - 它們產生相同的結果。您的承諾示例僅向您展示如何使用承諾setTimeout()

當你有更復雜的場景,比如你想要協調的多個異步操作,順序異步操作,異步操作中的錯誤處理等等時,promise的威力就來了......你展示的例子可能是最簡單的使用承諾,因此不會炫耀自己的能力或更有價值的使用方式。

以下是一些承諾是大量更加有用的情景:在處理

doSomethingAsync1().then(doSomethingAsync2).then(doSomethingAsync3).then(results -> { 
    // handle final result here 
}).catch(err => { 
    // handle error here 
}); 

協調多個異步操作

測序多用適當的錯誤異步操作,使您可以並行運行它們並知道它們何時全部完成

Promise.all(doSomethingAsync1(), doSomethingAsync2(), doSomethingAsync3()).then(results => { 
    // all results available here 
}).catch(err => { 
    // handle error here 
}) 

處理複雜的異步錯誤條件

doSomethingAsync1().then(result1 => { 
    if (result1 passes some condition) { 
     return doSomethingAsync2().then(r => { 
      // process result here 
     }); 
    } else { 
     return doSomethingAsync3().then(r => { 
      // process result here 
     }); 
    } 
}).catch(err => { 
    // all async errors will propagate to here 
}); 

啊,所有這些.then()處理程序「扔安全」,這意味着,如果在任何一個異步.then()處理程序發生異常,它會自動被抓住,轉身成爲一個被拒絕的承諾,在我所有的例子中都可以在.catch()處理程序中輕鬆處理。嘗試使用常規回調(無承諾)編寫該代碼。你將不得不嘗試/抓住每一個回調,以便「扔掉」安全。如果你沒有這樣做,任何異常拋出異步回調可能會被系統默默地吃掉。

+0

因此,將這些異步操作排序爲同步鏈的能力是其實際功率..我想我現在就明白了。 在第二個示例中,.all方法是否按照傳遞給它的順序嘗試解析doSomethingAsyncN()鏈(async1,然後是async2,然後是async3等),而沒有它們(承諾)依靠彼此? –

+1

@DavidJones - 這只是冰山一角,但足以證明使用它們是正確的。還有更多。 – jfriend00

+0

謝謝!出於某種原因,我確定我已經點擊了綠色複選標記。感謝您注意到我。 –