背景

思考:如果异步任务有两个结果:成功或者失败,怎么办
方法 一:回调接收两个参数
方法 二:搞两个回调
这些方法都不是非常好:

  1. 不规范,名称五花八,有人用success + error,

有人用success + fail,有人用done + fail

  1. 容易出现回调地域,代码变得看不懂
  2. 很难进行错误处理

回调地狱示例
image.png

解决这些问题

Promise 是异步编程的一种解决方案(抄袭后端),比传统的解决方案——回调函数和事件——更合理和更强大。
它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise 对象。

Promise用法

创建Promise

  1. const promise = new Promise(function(resolve, reject) {
  2. // ... some code
  3. if (/* 异步操作成功 */){
  4. resolve(value);
  5. } else {
  6. reject(error);
  7. }
  8. });

Promise.prototype.then()

then()方法返回一个 Promise。它最多需要有两个参数:Promise 的成功和失败情况的回调函数。

  1. getJSON("/posts.json").then(function(json) {
  2. return json.post;
  3. }).then(function(post) {
  4. // ...
  5. });

Promise.all()

Promise.all(iterble) 方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);
如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败的原因是第一个失败 promise 的结果。

  1. const p = Promise.all([p1, p2, p3]);

Promise.race()

Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。

  1. const p = Promise.race([p1, p2, p3]);