举一个文件操做的例子,先建立3个txt文件, a.txt,b.txt.c.txt 内容分别为 aaaa,bbbbb,cccc`api
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的一个简单案例ui
//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); })