两个异步的函数,都没有回调,在不改动两个函数原代码的情况下,有没有可能让他们按照指定的先后顺序执行?
function initGenerate () {
setTimeout(function () {
console.log('init done')
}, 3000);
}
function getPower () {
setTimeout(function () {
console.log('getPower done')
}, 2000);
}
我试了一下,不管怎么样包装它们,都改变不了它们天生没有回调函数的本质。
(function(cb) {
initGenerate();
cb();
})(function(){
getPower();
});
1
eason1874 2021-10-20 05:41:01 +08:00
setTimeout 会放到循环队列后面。你后面的代码只是影响加入队列的时间,并不影响他们在队列的位置。类似于两个人拿着先后两个号码牌来等叫号,只要还没轮到他们,不管谁先进门都不会改变叫号顺序。
最好是改变 initGenerate 和 getPower 的代码。 不过也有奇技淫巧可以解决,副作用未知。简单来说就是在调用这两个函数之前,把 setTimeout 备份到一个变量,重写一个函数覆盖 setTimeout,然后在调用之后,恢复 setTimeout 备份。 |
2
selfcreditgiving OP @eason1874 对的,一开始我还没转过弯来,以为自己这样写是可以的。后来想想搞不好是不可能完成的事。
setTimeout 给它调包了,这个确实是可以实现的。 现在倒也不想实现什么功能,主要是想了解下这个理论。当面对两个完全黑盒(或者不想去动)的函数,没有回调方法。有没有可能可以控制他们。 |
3
selfcreditgiving OP 不知道有没有长得帅的 解答一下 :)
|
4
libook 2021-10-20 14:41:55 +08:00
一般自己写的代码自己加个回调或者做成 promise 就好了。
别人的代码自己也不能改的话能不用就尽量不用了,轮子那么多,不一定在一棵树上吊死。 非要 Hack 的话上面楼层说的替换 setTimeout 是可以的,目前没想到别的方案,这样做可读性太差了,绝大多数情况下代码最重要的是可读性。 你要想控制一个黑盒,就还是要了解里面的原理的,要不然逆向工程也不会在安全领域那么重要,脚本语言有个好处就是你可以很方便地把代码复制一份,自己加些代码进去,然后劫持主程序执行自己的脚本。 |
5
zjsxwc 2021-10-20 15:38:40 +08:00
promise 也不行啊,promise 的前提是有 callback 能够修改 deferred 的状态,于是没提供 callback 也就不能 promise 。
|
6
selfcreditgiving OP echarts.init(domElement) 就没有提供回调,不知道现在改了没有
|