Promise链式调用与升级版

简介: promise链式调用,动态链式调用代码实现。

什么是链式调用?

对于用过jq的人来说这个概念很好理解,例如:

$('text').setStyle('color', 'red').show();

其中调用过setStyle方法后可以立即再调用show方法。这要的调用方式就是链式调用。

链式调用是如何实现的?

一般的链式调用完方法后,return this返回当前调用方法的对象就能实现链式调用。

首先,我们先来看看一般函数的调用方式

(1)先创建一个简单的类

//创建一个bird类functionBird(name) {
this.name=name;
this.run=function() {
console.log(name, "start run;");
 }
this.stopRun=function() {
console.log(name, "start run;");
 }
this.sing=function() {
console.log(name, "start sing;");
 }
this.stopSing=function() {
console.log(name, "start stopSing;");
 }
}

(2)使用方式:一般的调用方式

varbird=newBird("测试"); 
bird.run();
bird.sing();
bird.stopSing();
bird.stopRun();

(3)结果

测试startrun;
测试startsing;
测试startstopSing;
测试startrun;

总结,该种方式有一个弊端就是:多次重复使用一个对象变量

然后,我们再来看看将上述改成链式调用的格式

(1)在创建的简单类中加上return this,如下

//创建一个bird类functionBird(name) {
this.name=name;
this.run=function() {
console.log(name, "start run;");
returnthis;// return this返回当前调用方法的对象。 }
this.stopRun=function() {
console.log(name, "start run;");
returnthis;// return this返回当前调用方法的对象。 }
this.sing=function() {
console.log(name, "start sing;");
returnthis;// return this返回当前调用方法的对象。 }
this.stopSing=function() {
console.log(name, "start stopSing;");
returnthis;// return this返回当前调用方法的对象。 }
}

(2)使用链式调用(连缀的方式)

varbird=newBird("测试");
bird.run().sing().stopSing().stopRun();

(3)结果

测试startrun;
测试startsing;
测试startstopSing;
测试startrun;

总结此种方式的调用结果与一般的调用方式产生的结果一样,优点是:链式调用这种风格有助于简化代码的编写工作,让代码更加简洁、易读,同时也避免多次重复使用一个对象变量

Promise链式调用

什么是promise的链式调用呢

// 省市区functionprintProvince() {
returnnewPromise((resolve, reject) => {
setTimeout(() => {
console.log('省');
resolve();
    }, 100);
  });
}
functionprintCity() {
returnnewPromise((resolve, reject) => {
setTimeout(() => {
console.log('市');
resolve();
    }, 100);
  });
}
functionprintArea() {
returnnewPromise((resolve, reject) => {
setTimeout(() => {
console.log('区');
resolve();
    }, 100);
  });
}
printProvince().then(() => {
returnprintCity();
}).then(() => {
returnprintArea();
}).then(() => {
console.log('打印完成');
});

结果

打印完成

Promise链式调用升级版

上边的链式调用已经简化了一些代码,逻辑也比较清晰,但是在遇见大数据量的处理时then就要写好长好长,有没有好的方法能实现代码动态控制自动完成的情况呢?

constcreatePromise= (name) => () => {
returnnewPromise((resolve, reject) => {
setTimeout(() => {
console.log(name);
resolve();
    }, 100);
  });
}
constphones= ['华为', '小米', 'OPPO', '金立', '荣耀'];
constallP= [];
phones.forEach((phone) => {
allP.push(createPromise(phone));
});
allP.reduce((prev, next) =>prev.then(() =>next()), Promise.resolve()).then(() => {
console.log('执行完成');
});

执行结果:

华为小米OPPO金立荣耀执行完成

这样就可以动态生产一个链式调用的过程了。相比于上边的手动写链式调用要代码量少好多。

总结

有人说这个和Promise.all有点像,但是也有区别。

(1)链式调用是串行调用,一个promise执行完成后才调用下一个promise;Promise.all是并行执行,其中的promise没有先后顺序,有计算机随机调用。

(2)链式调用执行时间会长,但是占用的计算机资源少;Promise.all 执行时间相比链式调用短,但是占用的计算机资源多。

相关文章
|
1月前
|
前端开发
Promise链式调用与错误处理
Promise链式调用是处理异步操作的方式,它按顺序执行多个任务,每个任务返回Promise对象。通过`.then()`指定成功后的操作,`.catch()`处理错误。示例代码展示了如何使用fetch获取数据,根据状态码解析响应并处理数据,错误则通过`.catch()`捕获。另一个例子定义了三个异步函数构成Promise链,依次执行并处理结果,错误同样由`.catch()`统一管理。
|
1月前
|
前端开发 JavaScript
Promise的链式调用案例讲解
Promise的链式调用案例讲解
|
1月前
|
前端开发
Promise的链式调用
Promise的链式调用是指在一个Promise对象上连续调用多个then方法的过程。通过链式调用,可以将多个异步操作按照顺序执行,并且可以在每个操作完成后处理返回的结果。
39 0
|
10月前
|
前端开发 程序员
promise的链式调用和promise的嵌套的实现
promise的链式调用和promise的嵌套的实现
148 0
|
前端开发
手写Promise最简20行版本,实现异步链式调用。(重构版)
在面试的时候,经常会有面试官让你实现一个 Promise,如果参照 A+规范来实现的话,可能面到天黑都结束不了。
|
前端开发
重新手写promise,理解核心的异步链式调用原理
重新手写promise,理解核心的异步链式调用原理
150 0
|
前端开发 开发者
图解 Promise 实现原理(二)—— Promise 链式调用
本系列文章由浅入深逐步实现 Promise,并结合流程图、实例以及动画进行演示,达到深刻理解 Promise 用法的目的。
944 0
|
前端开发
Promise的异常穿透和中断Promise的链式请求
Promise的异常穿透和中断Promise的链式请求
|
前端开发 JavaScript
面试题:promise的链式怎么实现的
promise的链式怎么实现的
133 0
|
前端开发
Promise源码解密-then的链式调用
Promise源码解密-then的链式调用