素材牛VIP会员
js同步异步问题,怎么调用带callback函数的时候改成同步
 wz***16  分类:Node.js  人气:1118  回帖:9  发布于6年前 收藏
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)垃圾回帖将一律封号处理……

Lv6 码匠
co***ky Linux系统工程师 6年前#1

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

Lv3 码奴
上***水 职业无 6年前#2

题目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)
Lv6 码匠
阿***斤 CEO 6年前#3

同求问题,赞一个

Lv5 码农
Ca***on 职业无 6年前#4

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


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

Lv3 码奴
路***6 Web前端工程师 6年前#5

不是很明白出题人的用意,如果只是想要输出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);
    }
})());
Lv6 码匠
lu***ng 软件测试工程师 6年前#6

你需要async
nodejs之async异步编程 - CNode技术社区 http://cnodejs.org/topic/54ac...

Lv6 码匠
85***32 交互设计师 6年前#7

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

Lv4 码徒
日***天 职业无 6年前#8
var aTest=function(num){
    var current=0;
    function callback(){
        if(current<num){
            doExe(current++,callback);
        }
    }
}

试试这种

Lv2 入门
通***程 PHP开发工程师 6年前#9

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()

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取