promise鏈式調用時then的返回值

then方法裏接受兩個函數做爲參數,分別是resolve和reject後執行的回調,他返回的是一個新的Promise實例(不是原來那個Promise實例)。其實至關於then方法是兩個實際的回調函數,第一個回調函數的參數是定義promise執行成功時resolve括號裏的數據,這樣就能夠異步拿到數據了。第二個回調函數的參數是定義promise執行失敗時reject括號裏的數據。(resolve函數被調用時會觸發器then方法中的回調)json

  1. 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
  2. throw error函數

    返回的Promise會成爲Rejected的狀態,下一步執行catch中的回調函數或者then的第二個回調函數參數。(catch就是then(null, rejection)的別名,即失敗時調用的方法)。ui

  3. 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數據)對象

相關文章
相關標籤/搜索