异步编程
可以知道异步操作是不用管前面代码是否执行的,他可以自己干自己的
因此:
var fs = require('fs') fs.readFile('./data/a.txt', 'utf8', function (err, data) { if (err) { // return console.log('读取失败') // 抛出异常 // 1. 阻止程序的执行 // 2. 把错误消息打印到控制台 throw err } console.log(data) }) fs.readFile('./data/b.txt', 'utf8', function (err, data) { if (err) { // return console.log('读取失败') // 抛出异常 // 1. 阻止程序的执行 // 2. 把错误消息打印到控制台 throw err } console.log(data) }) fs.readFile('./data/c.txt', 'utf8', function (err, data) { if (err) { // return console.log('读取失败') // 抛出异常 // 1. 阻止程序的执行 // 2. 把错误消息打印到控制台 throw err } console.log(data) })
这种方式无法保证每一次都是读取到
a
>b
>c
这样的顺序于是就有了回调地狱嵌套
Promise
为了解决以上编码带来的问题(回调地狱嵌套),所以在EcmaScript6中新增了一个API:promise
。
var fs = require('fs')
// 创建一个 Promise 容器
// Promise 容器一旦创建,就开始执行里面的代码
// 承诺本身不是异步,仅仅是一个容器,只是在容器中封装异步任务
// 对promise进行封装
function pReadFile(filePath){
return new Promise(function(resolve, reject){
fs.readFile(filePath, 'utf8', function(err, data){
if(err)
reject(err) // 把容器的 Pending 状态变为Rejected
else
resolve(data) // 把容器的 Pending 状态变为Resolved
})
})
}
// 当 p1 读取成功的时候
// 当前函数中 return 的结果就可以在后面的 then 中 function 接收到
// return 'hello' 后面就then接会收到 'hello'
// 没有 return 后面收到的就是 undefined
// 我们可以 return 一个 Promise 对象
// 当 return 一个 Promise 对象的时候,后续的 then 中的 方法的第一个参数会作为 p2 的 resolve
pReadFile('./data/a.txt')
.then(function(data){
console.log(data)
return pReadFile('./data/b.txt')
})
.then(function(data){
console.log(data)
return pReadFile('./data/c.txt')
})
.then(function(data){
console.log(data)
})
此种方法一定是可以保证安装顺序执行的