promise链式调用

Promise实例的成功和失败的回调的返回值,能够传递到外层的下一个then。按照返回值类型能够分为如下几种:
a.promise 成功和失败的回调的返回值 能够传递到外层的下一个then
b. 返回值处理node

  • 若是返回的是普通值的话(传递到下一次的成功中, 不是错误 不是promise就是普通值),
  • 若是throw出错的状况(必定会走到下一次的失败,这里的出错是指,抛出错误,好比new Erro )
  • 若是返回promise的状况(会采用promise的状态,决定走下一个then的成功仍是失败)

c. 错误处理 若是离本身最近的then 没有错误处理(就是没有写错误函数),会向下找
d. 每次执行完Promise.then方法后,返回的都是一个‘新的promise’(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的成功中。ui

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

输出结果是code

---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的失败中。io

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

输出结果console

---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, "错误了!");
    }
  );

输出结果function

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

3.return promise, 会采用return promise的状态,决定走外层的下一个then的成功仍是失败require

  • 读取文件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'
} 错误了!
相关文章
相关标签/搜索