詳細資訊用於javascript中的承諾使用詳解

標梵互動發表於2020-11-10

熟悉前端開發的都一定寫過回撥方法(callback),簡單的說,回撥方法是一個函式被作為引數傳遞給另一個函式,比如下面的程式碼 


function say (value) {
    alert(value);
}
function execute (someFunction, value) {
    someFunction(value);
}
execute(say, 'hello word');


say函式作為引數傳遞給execute函式,一般來說我們會碰到的回撥巢狀都不會很多,一般就一到兩級,但是某些情況下,回撥巢狀很多時,程式碼就會非常繁瑣,會給我們的程式設計帶來很多的麻煩,這種情況俗稱——地獄回撥。


那麼如何解決地獄回撥,保持我們的程式碼簡短,這時Promise就出場了,Promise物件可以理解為一次執行的非同步操作,使用Promise物件之後可以使用一種鏈式呼叫的方式來組織程式碼;讓程式碼更加的直觀。我們用Promise物件改造上面的程式碼


function say(value) {
    return new Promise(function(resolve, reject) {
        resolve(value)
    })
}
function execute(value) {
    return new Promise(function(resolve, reject) {
        resolve(value)
    })
}
execute('hello word').then((value)=>{
    say(value).then((sayValue)=>{   
        alert(sayValue)
    })
})


上面程式碼只是根據第一段程式碼做的演示,程式碼量增加了,但是比傳統的解決方案更合理和更強大。


Promise正如字面意思-承諾,“承諾將來會執行”約定的事情。我們首先需要了解Promise的三種狀態:

pending: 初始狀態,既不是成功,也不是失敗狀態。


fulfilled: 意味著操作成功完成。


rejected: 意味著操作失敗。


先來構造下一個Promise例項


const promise = new Promise(function(resolve, reject) {
  // … some code
  If (/* 非同步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});


Promise建構函式接受一個函式作為引數,該函式的兩個引數分別是resolve和reject。它們是兩個函式。


Resolve函式的作用是,將Promise物件的狀態從“未完成”變為“成功”(即從 pending 變為 resolved),在非同步操作成功時呼叫,並將非同步操作的結果,作為引數傳遞出去;


Reject函式的作用是,將Promise物件的狀態從“未完成”變為“失敗”(即從 pending 變為 rejected),在非同步操作失敗時呼叫,並將非同步操作報出的錯誤,作為引數傳遞出去。


Promise例項生成以後,可以用then方法分別指定resolved狀態和rejected狀態的回撥函式。


還是拿第二段程式碼演示,講下執行過程,首先是這段程式碼


execute('hello word').then((value)=>{
    say(value).then((sayValue)=>{   
        alert(sayValue)
    })
})

首先是呼叫execute方法,傳入‘hello word’,這個execute方法返回promise物件。呼叫用then方法接收值,再呼叫say方法,傳入execute方法返回的值,再呼叫then方法接收,最後alert。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69987244/viewspace-2733283/,如需轉載,請註明出處,否則將追究法律責任。

相關文章