promise
回调地狱
普通的异步顺序不固定,若是想要控制顺序:
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)
})
})
})
把一个任务写在另一个任务的回调里面
但是嵌套太深,代码很丑,难以维护
解决回调地狱
为了解决回调地狱嵌套,在ecmaScript 6 中新增了一个API,叫 promise
promise 本身不是异步,但是内部往往都是异步
一旦promise 被new出来,就会立即执行里面的代码
var fs = require('fs')
//封装函数
//promise 的用法
//promise中有个函数,这个函数有两个参数,分别为resole,和reject,
//resole 返回 承诺实现了的对象
var pREADFILE = function(filePath){
//Promise是个承诺,承诺实现了,就把值给到resolve中
return new Promise(function(resolve, reject){
//下面是具体的事情
fs.readFile(filePath,'utf8',function(err,data){
if (err) {
reject(err)
}else{
//把实现成功的情况返回到 resolve 中
resolve(data)
}
})
})
}
pREADFILE('./data/a.txt')
//如果承诺实现了,然后
.then(function(data){
//pREADFILE('./data/a.txt')中的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)
})