代码如下:
function fun(){ var flag = false; setTimeout(function(){ flag = true; },1000) return flag; }
比方说我想让setTimeout这个异步函数执行完毕后再执行后面的return flag;,请问怎么实现呢?
return flag;
ringa_lee
“异步”,这个概念就是让某个函数先不要执行... 你所说的肯定没法直接实现。
如果你是要拿到异步结果的话,可以考虑回调函数,也可以考虑使用ES2016的async和await
没办法。如果要等 setTimeout 执行完再调用,只能用callback的方式
function fun(callback){ var flag = false; setTimeout(function(){ flag = true; callback(flag); },1000); return flag; }; function callbackFunction(flag){ alert(flag); } fun(callbackFunction);
异步和同步的区别就在于异步不阻塞程序执行你提的问题违背了异步本身的意义,考虑异步+回调实现你要的功能异步使用同步的写法在ES6中async/await有实现
本质上是实现一个迭代器,执行到await的时候暂停了,直到这一个Promise resolve后才会自动调用.next()继续执行。
.next()
你要的功能可以这样实现:
function func(ifSleeped){ if(!ifSleeped) { var flag = false; setTimeout(function() { func.call(this,true); },1000); } else { return flag; } } // 编译器会报错,没有在所有的条件判断中返回值,函数可能返回空值
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 })
因为异步函数不知道什么时候结束,所以不能用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); })
把return flag放到flag = true下面。
“异步”,这个概念就是让某个函数先不要执行... 你所说的肯定没法直接实现。
如果你是要拿到异步结果的话,可以考虑回调函数,也可以考虑使用ES2016的async和await
没办法。
如果要等 setTimeout 执行完再调用,只能用callback的方式
异步和同步的区别就在于异步不阻塞程序执行
你提的问题违背了异步本身的意义,考虑异步+回调实现你要的功能
异步使用同步的写法在ES6中async/await有实现
本质上是实现一个迭代器,执行到await的时候暂停了,直到这一个Promise resolve后才会自动调用
.next()
继续执行。你要的功能可以这样实现:
1.可以定义个戳判断
2.利用异步方案(promise,generator,async)
因为异步函数不知道什么时候结束,所以不能用return,只能在异步函数外面套一个函数形参为callback获得异步函数中执行的结果。举个简单的例子:
把return flag放到flag = true下面。