then方法裏接受兩個函數做爲參數,分別是resolve和reject後執行的回調,他返回的是一個新的Promise實例(不是原來那個Promise實例)。其實至關於then方法是兩個實際的回調函數,第一個回調函數的參數是定義promise執行成功時resolve括號裏的數據,這樣就能夠異步拿到數據了。第二個回調函數的參數是定義promise執行失敗時reject括號裏的數據。(resolve函數被調用時會觸發器then方法中的回調)json
-
return 值的狀況(無return的狀況下就返回undefined,也是返回值)promise
此時返回的Promise會成爲Fulfilled的狀態,return的值會做爲新的promise對象下一個then的回掉函數的參數值。異步
function test(){ const promise = new Promise((resolve,reject)=> { setTimeout(function(){ resolve('執行成功') },1000) }) return promise; } test().then(aData =>{ console.log('aData',aData) return '9' }).then(bData =>{ console.log('bData',bData) }) 輸出結果是: aData 執行成功 bData 9 當不寫return 9時,第二行輸出爲undefined
-
throw error函數
返回的Promise會成爲Rejected的狀態,下一步執行catch中的回調函數或者then的第二個回調函數參數。(catch就是then(null, rejection)的別名,即失敗時調用的方法)。ui
-
return Promise 手動return Promise, 返回的promise狀態不必定是resolved了,所以就能夠改變下一個then/catch調用的結果了,這個比較常見。code
const fs = require("fs") const path = require("path") function getFileContent(fileName){ const promise = new Promise((resolve,reject) => { const fullFileName = path.resolve(__dirname,"files",fileName) fs.readFile(fullFileName,(err,data) => { if(err){ reject(err) return } resolve(JSON.parse(data.toString())) }) }) return promise } getFileContent('a.json').then(aData =>{ console.log('a data', aData) return getFileContent(aData.next) }).then(bData =>{ console.log('bData',bData) }) 輸出爲: a data { next: 'b.json', content: '這是a.json' } bData { next: 'c.json', content: '這是b.json' } 此時,第一個then方法return的是一個讀取b.json的promise,當讀取成功時調用then方法,參數bData就是讀取到的值,實現了鏈式調用。
連環使用promise的then時,要記得使用return把promise傳出來 ,才能繼續傳的是promise。且在return中使用then方法進一步處理數據以後再return,後面的then拿到的數據都是上一步處理數據後的promise。(即return了一個promise的then方法,返回的是then方法處理過的promise數據)對象