新手请教链式调用怎么实现按顺序来执行

2020-03-14 23:21:26 +08:00
 keroppi

例如:

let interface = new MyMath().add().sub();

如果不用 promise 的情况下,怎么让 MyMath 构造函数执行完后再执行 add,最后执行 sub 方法?

可能表达的不太清楚,可能是我方向不对,本意是我写个库同事使用,我在百度查询过要实现上面的顺序执行,都是说要用 Promise,我们都是非计算机专业人员,所以不想让同事们去学习 promise 这些以降低难度。

请大家轻点一下

2934 次点击
所在节点    JavaScript
15 条回复
dangyuluo
2020-03-14 23:23:27 +08:00
括号?
lxk11153
2020-03-14 23:29:38 +08:00
看你各函数内怎么写的吧?
let interface = new MyMath().add().sub();

MyMath: function(){console.log(1);return this;}
add: function(){console.log(2);return this;}
sub: function(){console.log(3);return this;}
这样不是顺序执行的吗?
ayase252
2020-03-14 23:34:36 +08:00
是异步的吗?不是异步的为什么会查出来 promise?
wly19960911
2020-03-14 23:43:45 +08:00
链式调用按顺序? 你这必须写队列运行啊...实际上又实现了 promise。很无趣的,建议学习 promise 然后转 async function 会很愉快的
dremy
2020-03-15 00:37:36 +08:00
只要不需要用到异步,写同步代码就是顺序执行的,没这么乱七八糟
azcvcza
2020-03-15 00:51:33 +08:00
d3 库的正常操作,返回一个 this 就可以无限往下写
randyo
2020-03-15 00:58:09 +08:00
function MyMath(){}
MyMath.porototype.add=function (){return this}
MyMath.porototype.sub=function (){return this}
keroppi
2020-03-15 01:17:59 +08:00
@wly19960911
@lxk11153
@ayase252
@dremy

就是 MyMath 构造方法内有大量查询,还没执行完,就开始执行 add()方法了
just1
2020-03-15 01:25:55 +08:00
@keroppi #8 把查询写成同步就行了
longjiahui
2020-03-15 04:12:03 +08:00
构造函数内的异步没办法返回 promise 吧,那就用不了 async/await。
那只能构造的时候传一个回调函数作为参数

```js
let myMath = new MyMath(()=>{
myMath.add().sub();
});
```
Justin13
2020-03-15 08:38:46 +08:00
同步代码就是顺序执行的,如果其中夹杂异步操作,还想写链式,上 Promise 吧。
luvroot
2020-03-15 10:50:11 +08:00
return 自己的指针,类似
func (me *op) add () *op {
//do add
return me
}
zzzzzzggggggg
2020-03-15 17:27:29 +08:00
你混淆了链式调用和顺序执行
你在百度上查的应该是如果在有异步操作(例如 ajax 网络请求)的情况下依然使代码保持顺序执行,这种情况下需要使用 promise 或者 async await 等等方法
但是你给出的这个例子 let interface = new MyMath().add().sub(),不涉及异步操作的话,就在方法中 return this 保持一个上下文就可以实现链式调用
class MyMath {
constructor() {
// do something
}
add() {
// do something
return this;
}
sub() {
// don something
return this;
}
}

希望对你有帮助
zzzzzzggggggg
2020-03-15 17:30:07 +08:00
@keroppi 才看到你说了:“MyMath 构造方法内有大量查询,还没执行完,就开始执行 add()方法了”
这应该就是涉及到了异步的操作,需要学习 JavaScript 里的 promise 或者 async、await 来解决
secondwtq
2020-03-15 18:30:20 +08:00
楼主的需求是可以实现的,比如可以引入某种形式的回调
当然回调写多了就会考虑如何简化抽象
然后就会重新发明 Promise

“专业”的东西的存在是有其道理的,难度最低的路恰恰就是“专业”的路。忽视“专业”的成果自作聪明班门弄斧往往适得其反
当然楼主的需求可能走不到“回调写多了”那一步,那直接回调可能更直接一点

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/652869

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX