promise 基本用法
Promise 對象是一個構造函數,用來生成 Promise 實例。Promise 構造函數接受一個函數作為參數,該函數的兩個參數分別是 resolve 和 reject。
resolve 函數的作用是,在異步操作成功時調用(Promise 對象的狀態從 pending 變為 fulfilled),并將異步操作的結果,作為參數傳遞出去。
reject 函數的作用是,在異步操作失敗時調用(Promise對象的狀態從 pending 變為 rejected),并將異步操作報出的錯誤,作為參數傳遞出去。
const funPromise = function(options) { return new Promise(function(resolve, reject) { if (/* 異步操作成功 */){ resolve(result); } else { reject(error); } });}
resolve 函數的參數除了正常的值以外,還可能是另一個 Promise 實例,此時,初始 promise 的最終狀態根據傳入的新的 Promise 實例決定。
reject 方法的作用,相當于拋出錯誤。等同于 throw new Error('error')。
Promise.prototype.then()
Promise 實例具有 then 方法,它的作用是為 Promise 實例添加狀態改變時的回調函數,即 Promise 實例生成以后,用 then 方法分別指定 fulfilled 狀態和 rejected 狀態的回調函數。
funPromise().then(function(result) { // fulfilled}, function(error) { // rejected})
then 方法可以接受兩個回調函數作為參數。第一個回調函數是 Promise 對象的狀態變為 fulfilled 時調用,第二個回調函數是 Promise 對象的狀態變為 rejected 時調用。其中,第二個函數是可選的,不一定要提供。這兩個函數都接受 Promise 對象傳出的值作為參數。
then 方法返回的是一個新的 Promise 實例(注意,不是原來那個 Promise 實例)。因此可以采用鏈式寫法,即 then 方法后面再調用另一個 then 方法來處理上一個 then 方法中 return 的結果。
funPromise().then(function(result) { return result.data;}).then(function(data) { // fulfilled});
上面的代碼使用 then 方法,依次指定了兩個回調函數。第一個回調函數完成以后,會將返回結果作為參數,傳入第二個回調函數。并且,第一個 then 返回的結果也可以是另一個異步操作的 Promise 對象,這時后一個 then 函數,就會等待該 Promise 對象的狀態發生變化,才會被調用。
funPromise().then( (result) => { return funPromise(result); }).then( (data) => { /* fulfilled */ }, (error) => { /* rejected */ });
上面代碼中,第一個 then 方法指定的回調函數,返回的是另一個 Promise 對象。這時,第二個 then 方法指定的回調函數,就會等待這個新的 Promise 對象狀態發生變化。如果變為 fulfilled,就調用第一個回調函數,如果狀態變為 rejected,就調用第二個回調函數。
Promise.prototype.catch()
Promise 實例具有 catch 方法,它的作用是為 Promise 實例添加狀態改變為 rejected 狀態的回調函數,也就是 then 方法的第二個函數的替代寫法。
funPromise().then(function(result) { // fulfilled}).catch(function(error) { // 處理 funPromise 和之前 then 回調函數運行時發生的錯誤});
Promise 對象的錯誤具有“冒泡”性質,會一直向后傳遞,直到被捕獲為止。也就是說,無論前面有多少個 then 函數,其中的錯誤總是會被下一個 catch 語句捕獲。
funPromise().then(function(result) { return funPromise(result);}).then(function(data) { // fulfilled}).catch(function(error) { // 處理前面三個 Promise 產生的錯誤});
新聞熱點
疑難解答