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

2021-10-20 05:00:58 +08:00
 selfcreditgiving

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

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

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

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

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

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

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

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

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

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

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

你要想控制一个黑盒,就还是要了解里面的原理的,要不然逆向工程也不会在安全领域那么重要,脚本语言有个好处就是你可以很方便地把代码复制一份,自己加些代码进去,然后劫持主程序执行自己的脚本。
zjsxwc
2021-10-20 15:38:40 +08:00
promise 也不行啊,promise 的前提是有 callback 能够修改 deferred 的状态,于是没提供 callback 也就不能 promise 。
selfcreditgiving
2021-10-20 15:58:07 +08:00
echarts.init(domElement) 就没有提供回调,不知道现在改了没有

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

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

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

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

© 2021 V2EX