1.用ES6中 promise 解决回调地狱.

1. Promise 是一个构造函数,既然是构造函数,那么,我们就可以 new Promise () 得到一 个Promise的实例;

2. 在Promise 上,有两个函数1分别叫做resolve (成功之后的回调函数)和reject (失败之后的回调函数)

由于 Promise 的实例,是一个异步操作,所以,内部拿到操作的结果后,无法使用return把操作的结果返回给调用者;这时候,只能使用回调函数的形式,来把成功或失败的结果,返回给调用者;

3. 在Promise 构造函数的Prototype 属性上,有一个.then() 方法,也就说,只要是Promise构造函数创建的实例,都可以访问到.then() 方法

4. Promise 表示一个异步操作;每当我们new一个Promise 的实例,这个实例,就表示个具体的异步操作;

5. 既然Promise 创建的实例,是一个异步操作,那么,这个异步操作的结果,只能有两种状态:

  • 状态1 :异步执行成功了,需要在内部调用成功的回调函数resolve把结果返回给调用者;
  • 状态2 :异步执行失败了,需要在内部调用失败的回调函数reject把结果返回给调用者;

6. 每当我们new一个Promise实例的时候,就会立即执行这个一步操作的代码,例如

1
2
3
4
5
6
7
const fs = require('fs')
var promise = new Promise(function() {
fs.readFile('./files/2.txt','utf-8', (err,dataStr) => {
if (err) throw err
console.log(dataStr)
})
})

执行该文件:

如果不想让他立即执行,则将这个 new的promise 放在一个函数里面,并为这个函数传一个路径fpath,再调用函数即可

7. 我们可以在new出来的Promise 实例上,调用.then()方法,预先为这个Promise 异步操作,指定成功(resolve)和失败(reject)回调函数;

1
2
3
4
5
.then(function(data){
成功
},function(err){
失败
})

8.Promise正确打开方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

const fs = require('fs')
function getFileByPath(fpath) { // 1.定义方法
return new Promise(function (resolve, reject) {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {

if (err) return reject(err) //失败
resolve(dataStr) //成功

})
})
}
// .then(function(data){成功},function(err){失败})

getFileByPath('./files/11.txt') // 2.调用方法
.then(function (data) {
console.log(data);
return getFileByPath('./files/2.txt') // 如果成功了,这里给下一个then的使用 创造一个promise 实例
}, function (err) {
console.log("这是失败的结果:" + err);
return getFileByPath('./files/2.txt')// 如果失败了,这里也会给下一个then的使用,创造一个promise 实例,
//让后续的promise继续执行,如果前面出错,后面的停止就不要指定失败回调
})
.then(function (data) { //因为上一个 then中 return了一个新的 getFileByPath promise实例
console.log(data);
return getFileByPath('./files/3.txt')
})
.then(function (data) {
console.log(data);
})
.catch(function(err){
console.log("这是一个自动捕获错误的方法"+err);
})//catch 的作用: 如果前面有任何的promise 执行失败,则立即终止所有的promise的执行,并马上进入catch,抛出异常

console.log("这一步将会在所有之前执行---OKOKOKOKOK");

执行:

  • 因为我在第一次读文件的时候,故意填了一个错误的文件名,所以这里会捕捉一个错误,但是不会影响后面的执行