這篇文章透過多段程式碼實例帶大家了解 Promise 的基礎用法,以及更進一步掌握 Promise 非同步存取的想法。
之前一直有聽說 Promise 的威名,但總覺得是個較為深奧的東西,有點畏難而沒能真正地去了解。最近看了李立超老師在B站傳的 Node.js 的視頻,感覺講的很清晰,自己在這做進一步的梳理。
我們都知道JavaScript 是單執行緒運行的,所以如果遇到一個資料需要過一段時間才能取得的情況,就會形成阻塞導致後面的程式碼也無法執行,而這相當致命,例如下面程式碼
function sum(a, b) { const begin = Date.now(); while(Date.now() - begin < 10000) { } return a+b; } console.log(sum(1,2)); console.log("1");
中間的while 語句經歷了10秒的循環,最後才分別印出了3 和1
#然而我們希望的是允許3在10秒後再打印出來,但是1得先打印出來
這裡我們就用到了setTimeout
,修改代碼如下
function sum(a, b) { setTimeout(() => { return a+b; },10000) } console.log(sum(1,2)); console.log("1");
運行一下可以看到1確實瞬間被打印出來了,但是本該打印3的位置是undefined
#原因在於此時的console.log
同樣沒有等待setTimeout
走完,無法接收10秒後的資料
所以為了能夠接收到這個10秒後的數據,我們可以採用回呼函數的方式
function sum(a, b, callback) { setTimeout(() =>{ callback(a+b); }, 10000) } sum(1,2,(result) => { console.log(result); }); console.log("1");
傳入了一個能夠接收a b 為參數的回呼函數(result) => {console.log(result);}
sum(1,2,(result) => { sum(result, 3, (result) => { sum(result, 4, (result) => { console.log(result); }) }) });
const promise = new Promise(()=>{});
const promise = new Promise((resolve, reject) => { const flag = true; if (flag) { resolve("resolve datas"); } else { reject("reject data"); } })
promise.then(result => { console.log(result); }, reason => { console.log(reason); })
function sum(a, b) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(a+b); }, 1000); }) } sum(1,2) .then(result => sum(result,3)) .then(result => sum(result,4)) .then(result => { console.log(result); })
promise 通过then方法进行读取后,是个新的Promise对象,比如我们可以打印一下
function sum(a, b) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(a+b); }, 1000); }) } console.log(sum(1,2) .then(result => sum(result,3)))
所以这也就给了我们能多次调用then方法的基础。
而这也就解决了回调地狱的问题。
Promise 是一个可以存取异步数据的对象,通过resolve
和reject
来存储数据,可以通过then
来读取数据
至于其他的.catch
.finally
.race
.any
.all
这些方法就不再多作赘述,详细的见文档
【推荐学习:javascript高级教程】
以上是透過程式碼實例帶你了解Promise的詳細內容。更多資訊請關注PHP中文網其他相關文章!