V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
selfcreditgiving
V2EX  ›  JavaScript

两个异步方法没有回调函数,就一定不能控制他们的先后顺序嘛?

  •  
  •   selfcreditgiving · 2021-10-20 05:00:58 +08:00 · 2112 次点击
    这是一个创建于 912 天前的主题,其中的信息可能已经有所发展或是发生改变。

    两个异步的函数,都没有回调,在不改动两个函数原代码的情况下,有没有可能让他们按照指定的先后顺序执行?

    function initGenerate () {
        setTimeout(function () {
            console.log('init done')
        }, 3000);
    }
    
    function getPower () {
        setTimeout(function () {
            console.log('getPower done')
        }, 2000);
    }
    
    

    我试了一下,不管怎么样包装它们,都改变不了它们天生没有回调函数的本质。

    (function(cb) {
        initGenerate();
        cb();
    })(function(){
        getPower();
    });
    
    6 条回复    2021-10-20 15:58:07 +08:00
    eason1874
        1
    eason1874  
       2021-10-20 05:41:01 +08:00
    setTimeout 会放到循环队列后面。你后面的代码只是影响加入队列的时间,并不影响他们在队列的位置。类似于两个人拿着先后两个号码牌来等叫号,只要还没轮到他们,不管谁先进门都不会改变叫号顺序。

    最好是改变 initGenerate 和 getPower 的代码。

    不过也有奇技淫巧可以解决,副作用未知。简单来说就是在调用这两个函数之前,把 setTimeout 备份到一个变量,重写一个函数覆盖 setTimeout,然后在调用之后,恢复 setTimeout 备份。
    selfcreditgiving
        2
    selfcreditgiving  
    OP
       2021-10-20 05:53:41 +08:00
    @eason1874 对的,一开始我还没转过弯来,以为自己这样写是可以的。后来想想搞不好是不可能完成的事。

    setTimeout 给它调包了,这个确实是可以实现的。

    现在倒也不想实现什么功能,主要是想了解下这个理论。当面对两个完全黑盒(或者不想去动)的函数,没有回调方法。有没有可能可以控制他们。
    selfcreditgiving
        3
    selfcreditgiving  
    OP
       2021-10-20 14:23:33 +08:00
    不知道有没有长得帅的 解答一下 :)
    libook
        4
    libook  
       2021-10-20 14:41:55 +08:00
    一般自己写的代码自己加个回调或者做成 promise 就好了。

    别人的代码自己也不能改的话能不用就尽量不用了,轮子那么多,不一定在一棵树上吊死。

    非要 Hack 的话上面楼层说的替换 setTimeout 是可以的,目前没想到别的方案,这样做可读性太差了,绝大多数情况下代码最重要的是可读性。

    你要想控制一个黑盒,就还是要了解里面的原理的,要不然逆向工程也不会在安全领域那么重要,脚本语言有个好处就是你可以很方便地把代码复制一份,自己加些代码进去,然后劫持主程序执行自己的脚本。
    zjsxwc
        5
    zjsxwc  
       2021-10-20 15:38:40 +08:00
    promise 也不行啊,promise 的前提是有 callback 能够修改 deferred 的状态,于是没提供 callback 也就不能 promise 。
    selfcreditgiving
        6
    selfcreditgiving  
    OP
       2021-10-20 15:58:07 +08:00 via Android
    echarts.init(domElement) 就没有提供回调,不知道现在改了没有
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4766 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 03:57 · PVG 11:57 · LAX 20:57 · JFK 23:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.