新手请教链式调用怎么实现按顺序来执行 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
keroppi
V2EX    Javascript

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

  •  
  •   keroppi 2020-03-14 23:21:26 +08:00 3214 次点击
    这是一个创建于 2046 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如:

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

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

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

    请大家轻点一下

    15 条回复    2020-03-15 18:30:20 +08:00
    dangyuluo
        1
    dangyuluo  
       2020-03-14 23:23:27 +08:00
    括号?
    lxk11153
        2
    lxk11153  
       2020-03-14 23:29:38 +08:00   1
    看你各函数内怎么写的吧?
    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
        3
    ayase252  
       2020-03-14 23:34:36 +08:00
    是异步的吗?不是异步的为什么会查出来 promise?
    wly19960911
        4
    wly19960911  
       2020-03-14 23:43:45 +08:00
    链式调用按顺序? 你这必须写队列运行啊...实际上又实现了 promise。很无趣的,建议学习 promise 然后转 async function 会很愉快的
    dremy
        5
    dremy  
       2020-03-15 00:37:36 +08:00 via iPhone   1
    只要不需要用到异步,写同步代码就是顺序执行的,没这么乱七八糟
    azcvcza
        6
    azcvcza  
       2020-03-15 00:51:33 +08:00
    d3 库的正常操作,返回一个 this 就可以无限往下写
    randyo
        7
    randyo  
       2020-03-15 00:58:09 +08:00 via Android
    function MyMath(){}
    MyMath.porototype.add=function (){return this}
    MyMath.porototype.sub=function (){return this}
    keroppi
        8
    keroppi  
    OP
       2020-03-15 01:17:59 +08:00
    @wly19960911
    @lxk11153
    @ayase252
    @dremy

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

    ```js
    let myMath = new MyMath(()=>{
    myMath.add().sub();
    });
    ```
    Justin13
        11
    Justin13  
       2020-03-15 08:38:46 +08:00 via Android
    同步代码就是顺序执行的,如果其中夹杂异步操作,还想写链式,上 Promise 吧。
    luvroot
        12
    luvroot  
       2020-03-15 10:50:11 +08:00
    return 自己的指针,类似
    func (me *op) add () *op {
    //do add
    return me
    }
    zzzzzzggggggg
        13
    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
        14
    zzzzzzggggggg  
       2020-03-15 17:30:07 +08:00
    @keroppi 才看到你说了:“MyMath 构造方法内有大量查询,还没执行完,就开始执行 add()方法了”
    这应该就是涉及到了异步的操作,需要学习 Javascript 里的 promise 或者 async、await 来解决
    secondwtq
        15
    secondwtq  
       2020-03-15 18:30:20 +08:00
    楼主的需求是可以实现的,比如可以引入某种形式的回调
    当然回调写多了就会考虑如何简化抽象
    然后就会重新发明 Promise

    “专业”的东西的存在是有其道理的,难度最低的路恰恰就是“专业”的路。忽视“专业”的成果自作聪明班门弄斧往往适得其反
    当然楼主的需求可能走不到“回调写多了”那一步,那直接回调可能更直接一点
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3292 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 11:32 PVG 19:32 LAX 04:32 JFK 07:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86