js同步异步问题,怎么调用带callback函数的时候改成同步

var doExe = function (a , callback) {
    setTimeout(function () {
        console.log(a)
        if(callback) callback
    }, 100 * Math.random())
}
var aTest = function (num) {
    for(var i=0 ; i<num ; i++){
          doExe(i)
    }
}

aTest(10)

不知道有没有记错题目。。。。。。。
doExe是带个callback的函数, 现在aTest执行出来的顺序是乱的,要求按顺序输出0123456789

doExe不能改, aTest可以随便改。。。。求大神指点,闭包也行,队列+apply也行,实在没搞懂。。。。。

阅读 9.7k
9 个回答

很简单,你如果不追求代码的美观性和可读性的话,直接把接下来要执行的代码写在回调函数里就好了,一层一层嵌套下去,祝福你~


开个玩笑
Promise:https://segmentfault.com/a/11...
Async/Await:https://segmentfault.com/a/11...
看完这两个希望你能写出自己的异步解决方案~

var doExe = function (a , callback) {

setTimeout(function () {
    console.log(a)
    if(callback) callback()
}, 100 * Math.random())

}
var i = 0;
var aTest = function () {

if(i < 10) {
    doExe(i, aTest)
    i++;
}

}
aTest()

不是很明白出题人的用意,如果只是想要输出0123456789,而又不改变doExe函数,那就在callback上动动手脚好了。

var doExe = function (a, callback) {
    setTimeout(function () {
        console.log(a);
        if (callback) 
            callback
    }, 100 * Math.random())
}

doExe(9, (() => {
    for (let i = 0; i < 8; i++) {
        console.log(i);
    }
})());

题目callback这个地方你记得就是这样的吗?

if (callback) 
    callback

我加了个括号:

var doExe = function (a, callback) {
    setTimeout(function () {
        console.log(a)
        if (callback) {
            callback()
        }
    }, 100 * Math.random())
}
var max = 9
var aTest = function (index) {
    doExe(index, () => {
        index < max && aTest(++index)
    })
}
aTest(0)
新手上路,请多包涵

亲们,此题重点应该在于200*Math.random啊。
因为不知道何时会下个setTimeout调用,所以必须保证settimeout每次调用后a的值都必须是递增的,所以传入doExe的a值就必须是相对他来说的全局变量了。
看效果(电脑没网,只能拍图用手机上传了,等有空了上传代码)
Image

既然aTest 可以随便改。。。。那。。方法体内不一定要调用doExe吧。。。O(∩_∩)O哈!

var aTest=function(num){
    var current=0;
    function callback(){
        if(current<num){
            doExe(current++,callback);
        }
    }
}

试试这种

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题