then方法里接受两个函数作为参数,分别是resolve和reject后执行的回调,他返回的是一个新的Promise实例(不是原来那个Promise实例)。

  1. return 值的情况(无return的情况下就返回undefined,也是返回值

    此时返回的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)的别名,即失败时调用的方法)。

  3. return Promise手动return Promise, 返回的promise状态不一定是resolved了,因此就可以改变下一个then/catch调用的结果了,这个比较常见。

    	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就是读取到的值,实现了链式调用。
    
09-27 21:46