Promise实例的胜利和失败的回调的返回值,能够传递到外层的下一个then。依照返回值类型能够分为以下几种:
a.promise 胜利和失败的回调的返回值 能够传递到外层的下一个then
b. 返回值解决

  • 如果返回的是一般值的话(传递到下一次的胜利中, 不是谬误 不是promise就是一般值),
  • 如果throw出错的状况(肯定会走到下一次的失败,这里的出错是指,抛出谬误,比方new Erro )
  • 如果返回promise的状况(会采纳promise的状态,决定走下一个then的胜利还是失败)

c. 错误处理 如果离本人最近的then 没有错误处理(就是没有写谬误函数),会向下找
d. 每次执行完Promise.then办法后,返回的都是一个‘新的promise’(promise一旦胜利或者失败就不能批改状态)

阐明name.txt和age.txt文件都存在,name1.txt文件不存在

let fs = require("fs");function read(filename) {  return new Promise((resolve, reject) => {    fs.readFile(filename, "utf8", (err, data) => {      if (err) return reject(err);      resolve(data);    });  });}

1.返回一般值(不是throw Error, 不是return promise 都属于返回的一般值),传递到外层的下一个then的胜利中。

  • 读取文件name1.txt失败时
read("./name1.txt").then(    (data) => {      return 123;    },    (err) => {      return err;    }  ).then(    (data) => {      console.log("---success--", data);    },    (err) => {      console.log("---fail--", err, "谬误了!");    }  );

输入后果是

---success-- [Error: ENOENT: no such file or directory, open 'd:\myproject\node-s\name1.txt'] {  errno: -4058,  code: 'ENOENT',  syscall: 'open',  path: 'd:\\myproject\\node-s\\name1.txt'}
  • 读取文件name.txt胜利时候
read("./name.txt").then(    (data) => {      return 123;    },    (err) => {      return err;    }  ).then(    (data) => {      console.log("---success--", data);    },    (err) => {      console.log("---fail--", err, "谬误了!");    }  );

输入后果
---success-- 123

2.throw Error/throw new Error(),传递到外层的下一个then的失败中。

  • 读取文件name1.txt失败时
read("./name1.txt").then(    (data) => {      return 123;    },    (err) => {      throw err;    }  ).then(    (data) => {      console.log("---success--", data);    },    (err) => {      console.log("---fail--", err, "谬误了!");    }  );

输入后果

---fail-- [Error: ENOENT: no such file or directory, open 'd:\myproject\node-s\name1.txt'] {  errno: -4058,  code: 'ENOENT',  syscall: 'open',  path: 'd:\\myproject\\node-s\\name1.txt'} 谬误了!
  • 读取文件name.txt胜利时
read("./name.txt").then(    (data) => {      throw Error( 123);    },    (err) => {      throw err;    }  ).then(    (data) => {      console.log("---success--", data);    },    (err) => {      console.log("---fail--", err, "谬误了!");    }  );

输入后果

---fail-- Error: 123    at d:\myproject\node-s\2.promise\1.promise.js:32:13 谬误了!

3.return promise, 会采纳return promise的状态,决定走外层的下一个then的胜利还是失败

  • 读取文件name.txt胜利,return promise胜利态时
read("./name.txt").then(    (data) => {      return read('./age.txt');    },    (err) => {      throw err;    }  ).then(    (data) => {      console.log("---success--", data);    },    (err) => {      console.log("---fail--", err, "谬误了!");    }  );

输入后果:
---success-- 88

  • 读取文件name.txt胜利,return promise失败态时
read("./name.txt").then(    (data) => {      return read('./age1.txt');    },    (err) => {      throw err;    }  ).then(    (data) => {      console.log("---success--", data);    },    (err) => {      console.log("---fail--", err, "谬误了!");    }  );

输入后果:

---fail-- [Error: ENOENT: no such file or directory, open 'd:\myproject\node-s\age1.txt'] {  errno: -4058,  code: 'ENOENT',  syscall: 'open',  path: 'd:\\myproject\\node-s\\age1.txt'} 谬误了!
  • 读取文件name1.txt失败时,如果有失败函数回调
read("./name1.txt").then(    (data) => {      return read('./age1.txt');    },    (err) => {      console.log(err);      // 默认return undefined    }  ).then(    (data) => {      console.log("---success--", data);    },    (err) => {      console.log("---fail--", err, "谬误了!");    }  );

输出后果:

[Error: ENOENT: no such file or directory, open 'd:\myproject\node-s\name1.txt'] {  errno: -4058,  code: 'ENOENT',  syscall: 'open',  path: 'd:\\myproject\\node-s\\name1.txt'}---success-- undefined
  • 读取文件name1.txt失败时,以后then没有失败函数回调,会向下查找,下个then的失败回调函数。如果向下始终没有谬误回调函数则会报错~~~~
read("./name1.txt").then(    (data) => {      return read('./age1.txt');    }).then(    (data) => {      console.log("---success--", data);    },    (err) => {      console.log("---fail--", err, "谬误了!");    }  );

输入后果:

---fail-- [Error: ENOENT: no such file or directory, open 'd:\myproject\node-s\name1.txt'] {  errno: -4058,  code: 'ENOENT',  syscall: 'open',  path: 'd:\\myproject\\node-s\\name1.txt'} 谬误了!