首页 > 开发 > JS > 正文

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

2017-09-05 12:51:30  来源:网友分享
    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
写着玩儿的,仅供参考。