then方法里接受两个函数作为参数,分别是resolve和reject后执行的回调,他返回的是一个新的Promise实例(不是原来那个Promise实例)。
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
throw error
返回的Promise会成为Rejected的状态,下一步执行catch中的回调函数或者then的第二个回调函数参数。(catch就是then(null, rejection)的别名,即失败时调用的方法)。
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就是读取到的值,实现了链式调用。