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 · 2942 次点击
    这是一个创建于 1714 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如:

    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   ·   实用小工具   ·   2810 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 00:06 · PVG 08:06 · LAX 16:06 · JFK 19:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.