search

Home  >  Q&A  >  body text

javascript - JS中如何和让异步函数优先执行?

代码如下:

function fun(){
    var flag = false;
    setTimeout(function(){
        flag = true;        
    },1000)
    return flag;
}

比方说我想让setTimeout这个异步函数执行完毕后再执行后面的return flag;,请问怎么实现呢?

ringa_leeringa_lee2914 days ago620

reply all(6)I'll reply

  • 天蓬老师

    天蓬老师2017-04-11 13:03:13

    “异步”,这个概念就是让某个函数先不要执行... 你所说的肯定没法直接实现。

    如果你是要拿到异步结果的话,可以考虑回调函数,也可以考虑使用ES2016的async和await

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 13:03:13

    没办法。
    如果要等 setTimeout 执行完再调用,只能用callback的方式

    function fun(callback){
        var flag = false;
        setTimeout(function(){
            flag = true;        
            callback(flag);
        },1000);
        return flag;
    };
    
    function callbackFunction(flag){
        alert(flag);
    }
    fun(callbackFunction);

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-11 13:03:13

    异步同步的区别就在于异步不阻塞程序执行
    你提的问题违背了异步本身的意义,考虑异步+回调实现你要的功能
    异步使用同步的写法在ES6中async/await有实现

    本质上是实现一个迭代器,执行到await的时候暂停了,直到这一个Promise resolve后才会自动调用.next()继续执行。


    你要的功能可以这样实现:

    function func(ifSleeped){
        if(!ifSleeped) {
            var flag = false;
            setTimeout(function() { func.call(this,true); },1000);
        } else {
            return flag;
        }
    }
    // 编译器会报错,没有在所有的条件判断中返回值,函数可能返回空值

    reply
    0
  • PHPz

    PHPz2017-04-11 13:03:13

    1.可以定义个戳判断

    if(flag == true){
     return flag
    }

    2.利用异步方案(promise,generator,async)

    var p = new Promise(function (resolve, reject) {
        setTimeout(function(){
            flag = true;
            resolve(flag)
        },1000)
    })
    
    p.then(function(flag){
      // 处理flag
    })
    

    reply
    0
  • PHPz

    PHPz2017-04-11 13:03:13

    因为异步函数不知道什么时候结束,所以不能用return,只能在异步函数外面套一个函数形参为callback获得异步函数中执行的结果。举个简单的例子:

    //这是一个异步方法
    function fun(callback){
        setTimeout(function(){
            var a = 1;
            a++;
            callback(a);    //a作为实参传入回调函数
            console.log("我是异步函数,我执行完毕了!");
        },500)
    }
    fun(function(b){    //b作为形参,接收fun方法中传入的变量a
        console.log(b);
    })

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-11 13:03:13

    把return flag放到flag = true下面。

    reply
    0
  • Cancelreply