背景
思考:如果异步任务有两个结果:成功或者失败,怎么办
方法 一:回调接收两个参数
方法 二:搞两个回调
这些方法都不是非常好:
- 不规范,名称五花八,有人用success + error,
有人用success + fail,有人用done + fail
- 容易出现回调地域,代码变得看不懂
- 很难进行错误处理
解决这些问题
Promise 是异步编程的一种解决方案(抄袭后端),比传统的解决方案——回调函数和事件——更合理和更强大。
它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise 对象。
Promise用法
创建Promise
const promise = new Promise(function(resolve, reject) {// ... some codeif (/* 异步操作成功 */){resolve(value);} else {reject(error);}});
Promise.prototype.then()
then()方法返回一个 Promise。它最多需要有两个参数:Promise 的成功和失败情况的回调函数。
getJSON("/posts.json").then(function(json) {return json.post;}).then(function(post) {// ...});
Promise.all()
Promise.all(iterble) 方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);
如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败的原因是第一个失败 promise 的结果。
const p = Promise.all([p1, p2, p3]);
Promise.race()
Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。
const p = Promise.race([p1, p2, p3]);
