首页 > 在JavaScript中,如何在异步回调函数中控制循环?

在JavaScript中,如何在异步回调函数中控制循环?

    var SearchJavaStrate={
        findCil:function(cb){
            child_process.exec("java -XshowSettings:properties",function(error, stdout, stderr){
                var java_env=stderr.toString().match(/sun.boot.library.path.+/)[0];
                if(java_env){
                    java_env=path.join(java_env.match(/=.+/)[0].substr(1),"/javaw.exe")
                    console.log(15,java_env)
                    cb(false,java_env)
                }else{
                    cb(true)
                }
            })


        },
        find32Dir:function(cb){
            if(fs.existsSync("c:/Program Files/java/")){
                var java_env='c:/Program Files/java/'
                var java_dir=fs.readdirSync(java_env)[0]
                if(java_dir.length>0||java_dir){
                    var java_env=path.join(java_env,java_dir,"/bin/javaw.exe")
                    cb(false,java_env)
                }else{
                    cb(true)
                }
            }

        },
        find64Dir:function(cb){
            if(fs.existsSync("c:/Program Files (x86)/java/")){
                var java_env='c:/Program Files (x86)/java/'
                var java_dir=fs.readdirSync(java_env)[0]
                if(java_dir.length>0||java_dir){
                    var java_env=path.join(java_env,java_dir,"/bin/javaw.exe")
                    cb(false,java_env)
                }else{
                    cb(true)

                }
            }
        }
    }

    var SearchJavaContext=function(){
        var cache=[];
        var add=function(strate){
            strate.forEach(function(e,i){
                cache.push(function(cb){
                    SearchJavaStrate[e](cb)
                })
            })
        }




        return {
            init:function(strate,cb){
                if(strate&&strate.length>1){
                    add(strate)
                    console.log(cache)
                    var len=cache.length;
                    var i=0;
                    function funcFor(fn){
                        console.log(fn.toString())
                        fn(function(next,data){
                            if(next){
                                i++;
                                if(i>len){
                                    cb(null)
                                }
                                arguments.callee(cache[i])
                            }else{
                                cb(data)
                            }
                        })
                    }
                    funcFor(cache[i])
                }
            }
        }
    }()



    SearchJavaContext.init(["findCil","find64Dir","find32Dir"],function(data){
        console.log("89",data)
        if(data){
            event.sender.send("searchJave:result",data)
        }

    })

这里有一段代码 其中SearchJavaStrate下的所有属性都是函数,然后在SearchJavaContext的init方法中把这堆属性添加进了一个数组 数组内容大致为function(cb){SearchJavaStrate["findCil"},.....]
添加进数组后就需要循环执行这些数组函数
现在有个问题就是
当执行第一个函数的时候如果已经返回结果了,那么就不需要执行第二段函数了直接跳出循环
但是,执行返回的结果都是异步的.所以正如标题所言 如何在异步回调函数中控制循环
上述我是用递归的方法实现了循环的控制..
恳请各位大神指点迷津.


最简单的办法就是在第一个异步方法的回调函数里调用下一个方法。


推荐async之类的库,里面有相关的API
正好解决你的问题。

另外,我之前写过一个库,专门解决这类问题:
https://github.com/manxisuo/JFlow
写着玩儿的,仅供参考。

【热门文章】
【热门文章】