本文的一些知识点摘自 MDN web doc, 如果大家想深入研究,能够去看原文 [应用 Promise] & [Promise 文档]
- Promise 有什么用?
在没有 Promise 之前,咱们在实现异步的时候通常通过回调函数,有时候因为业务逻辑简单,会呈现一个回调嵌套另一个回调,造成回调天堂。ES6 Promise 的呈现提供了一种更好的解决异步的办法。
- Promise 如何应用
场景:工作 Task 分为 A 步骤和 B 步骤,A 步骤胜利与否决定咱们执行 B_success 还是 B_failure。
// 当咱们单纯的通过回调函数实现
function function_A(params, callback_success, callback_failure) {
// What we need to do in A
if(success){callback_success();
} else {callback_failure();
}
}
function function_B_success() {// What we need to do in B after A succeed}
function function_B_failure() {// What we need to do in B after A failed}
// 执行 Task
function_A(params, function_B_success, function_B_failure);
当初咱们有了 Promise,他是一个对象,示意一个异步操作的后果是实现了还是失败了
// 第一种写法
const promise = function_A(params);
promise.then(function_B_success, function_B_failure);
// 第二种写法
function_A(params).then(function_B_success, function_B_failure);
- Promise 约定的是什么?
Promise 在英语里是约定,允诺的意思。Promise 约定的有三点:
- 在本轮事件循环运行实现之前,回调函数是不会被调用的。
- 即便异步操作曾经实现(胜利或失败),在这之后通过 then 增加的回调函数也会被调用。
- 通过屡次调用 then 能够增加多个回调函数,它们会依照插入程序执行。
- 什么是事件循环?
在 JS 中有一套并发模型,负责收集,解决队伍中的工作。这个解决模型就叫做事件循环。大家如果想深刻理解能够读 MDN 文档当前有机会独自和大家聊事件循环。
- .then() 办法
then() 最多须要两个参数, Promise 的胜利和失败状况的回调函数。
p.then(onFulfilled\[, onRejected\]);
p.then(value => {// fulfillment}, reason => {// rejection});
then 会返回一个新的 Promise 对象,如下
const promise1 = doSomething();
const promise2 = promise1.then(successCallback, failureCallback);
所以 then 会返回一个新的 promise 对象,示意上一个 promise 回调函数的状态,也就是 doSomething 胜利或者失败后的回调函数的执行状态,这样就造成了一个链条。咱们称其为链式调用。
如果要实现链式调用,前一个 promise 要进行 return,不能够简略的写成箭头函数。
链式调用中如果某一环抛出谬误 throw new Error(‘error’);
, 则间接跳至 catch,然而 catch 之后的 then 不会被影响。
- Promise 的三种状态 — pending/fulfillment/rejection
Pending 示意未决,即还在执行中,未失去后果
Fulfillment 示意胜利
Rejectection 示意失败
- .resolve() 办法
**Promise.resolve(value)**
办法返回一个以给定值解析后的 Promise 对象。如果这个值是一个 promise,那么将返回这个 promise;如果这个值是 thenable(即带有 then 办法),返回的 promise 会“追随”这个 thenable 的对象,采纳它的最终状态;否则返回的 promise 将以此值实现。此函数将类 promise 对象的多层嵌套展平。
以上是 MDN 给出的解释,简略来讲就是两种状况:
- value 是一个简略的值,比方数字,字符串,数组,这个时候 Promise.resolve(value) 返回一个 promise 对象,这个对象的 then 的胜利回调函数参数为 value。
- value 是一个 thenable 对象
// original 是咱们说的 thenable 对象
var original = Promise.resolve(33);
// promise 是咱们通过 resolve 返回的 Promise 对象
var promise = Promise.resolve(original);
// 这时候的 promise 胜利状况会进行 original 这个 thenable 的最终后果,也就是一层一层走到最底层
promise.then(function(value) {console.log('value:' + value);
});
console.log('original === promise ?' + (original === promise));
/*
* 打印程序如下,这里有一个同步异步先后执行的区别
* original === cast ? true
* value: 33
*/
- reject() 办法
返回一個帶有拒絕起因的 Promise 对象。
// 因为 reject 传入 Error 对象,所以 resolved 不会被调用
function resolved(result) {console.log('Resolved');
}
//rejected 被调用
function rejected(result) {console.error(result);
}
//Error 是一个谬误结构器
Promise.reject(new Error('fail')).then(resolved, rejected);
// expected output: Error: fail