赞
踩
promise是异步调用的语法糖,其最大优势就是把原来的ajax或httpXmlRequest的嵌套回调调用,转化为链式调用,增强了书写规范和避免地域回调带来弊端。
在使用promise要注意,promise分为三种状Pending(进行中),Fulfilled(已成功),Rejected(已失败),当执行成功时Pending转化Fulfilled,当执行失败时,Pending转化为Rejected。而且转化不可逆。
Promise实现类分为:状态管理、执行结果、执行成功回调和执行失败回调,其内部实现好比是一个订阅/发布,回调列表通过then注册,由执行状态触发。
Promise可以实现多个订阅者(then),但单个Promise执行状态只有储存一个执行结果,为保证在多个回调中既可以共享执行结果,又可以链式处理结果,形成流水操作,在书写时特别要注意:promise.then方法注册时,会发回一个新的promise对象,即const promise1 = new Promise(cb).then()和const promise1 = new Promise(cb).then().then()不是同一个promise对象。如果共享同一个执行结果写法:
const promise1 = new Promise(cb);
promise1.then(onLisener1);
promise1.then(onLisener2);
这样就可以保证onLisener1,onLisener2入参一致性。
若想链式处理执行结果,且前一个执行结果是后一个入参,则采用const promise1 = new Promise(cb).then(
onLisener1).then(
onLisener2);
- const promise1 = new Promise((resolve, reject) => {
- setTimeout(() => {
- resolve('promise1');
- },5000)
- });
-
- promise1.then((val) => {
- console.log(val,':promise1.then');
- return 'promise1.then';
- });
-
- const promise2 = promise1.then((val) => {
- // 1、promise1.then首先新建一个新的promise,为后续的链式提供then方法
- // 2、根据promise当前状态,执行注册内容调用
- console.log(val,':promise1-promise1');
- return 'promise1-promise1';
- }).then((val) => {
- console.log(val,':promise2-2');
- return 'promise2-2';
- }).then((val) => {
- console.log(val,':promise2-3');
- return 'promise2-3';
- });
-
- promise2.then((val)=> {
- console.log(val, 'promise2-xxx');
- return 'promise2-xxx';
- });
-
- promise1.then((val) => {
- console.log(val, ':promise1.then2');
- return 'promise1.then2';
- });

执行结果:
- promise1 :promise1.then
- promise1 :promise1-promise1
- promise1 :promise1.then2
- promise1-promise1 :promise2-2
- promise2-2 :promise2-3
- promise2-3 promise2-xxx
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。