回调地狱问题
举一个文件操作的例子,先创建3个txt文件, a.txt,b.txt.c.txt 内容分别为 aaaa,bbbbb,cccc`
var fs = require('fs') //文件操作是异步的 执行顺序不一定是按顺序执行 fs.readFile('./data/a.txt','utf8',function(err,data){ if(err){ //return console.log('读取失败') //抛出异常,阻止程序继续执行,把错误打印到控制台 throw err; } console.log(data) }) fs.readFile('./data/b.txt','utf8',function(err,data){ if(err){ //return console.log('读取失败') //抛出异常,阻止程序继续执行,把错误打印到控制台 throw err; } console.log(data) }) fs.readFile('./data/c.txt','utf8',function(err,data){ if(err){ //return console.log('读取失败') //抛出异常,阻止程序继续执行,把错误打印到控制台 throw err; } console.log(data) })
有时我们可能想要程序按照顺序执行
var fs = require('fs') //在a回调函数种执行b,b的回调函数种执行c 这样就形成了多层嵌套,称为回调地狱 fs.readFile('./data/a.txt','utf8',function(err,data){ if(err){ //return console.log('读取失败') //抛出异常,阻止程序继续执行,把错误打印到控制台 throw err; } console.log(data) fs.readFile('./data/b.txt','utf8',function(err,data){ if(err){ //return console.log('读取失败') //抛出异常,阻止程序继续执行,把错误打印到控制台 throw err; } console.log(data) fs.readFile('./data/c.txt','utf8',function(err,data){ if(err){ //return console.log('读取失败') //抛出异常,阻止程序继续执行,把错误打印到控制台 throw err; } console.log(data) }) }) })
随之EcrameScript种出现了Promise这个api来解决这种回调嵌套的问题
下面是一个Promise的一个简单案例
//Promise是一个构造函数 var fs = require('fs') /** * Promise容器中存放异步任务,有三个状态, * Pending(正在进行), * Resolved(成功) * Rejected(失败) * 执行结束只会有两种结果 * Pending-->Resolved * Pending-->Rejected */ //创建Promise容器 一旦创建就会执行里面的代码 var p1 = new Promise(function(resolve,reject) { fs.readFile('./data/a.txt','utf8',function(err,data){ if(err){ reject('失败') }else{ resolve(data) } }) }) var p2 = new Promise(function(resolve,reject) { fs.readFile('./data/b.txt','utf8',function(err,data){ if(err){ reject('失败') }else{ resolve(data) } }) }) var p3 = new Promise(function(resolve,reject) { fs.readFile('./data/c.txt','utf8',function(err,data){ if(err){ reject('失败') }else{ resolve(data) } }) }) /* 当p1执行成功的时候 当前函数种return的结果就可以在then的funtion中得到, 也就是可以在then中的回调函数中得到 return 123得到的就是123 没有return得到的就是undefined 真正使用的话,我们是可以return一个Promise对象 return 一个Promise对象时,后续的then中的第一个参数就是返回的Promise对象的resolve参数 */ p1.then(function(data){ console.log(data); return p2 },function(err){ console.log(err); }) .then(function(data){ console.log(data); return p3 }) .then(function(data){ console.log(data); })