代码如下:
function fun(){
var flag = false;
setTimeout(function(){
flag = true;
},1000)
return flag;
}
比方说我想让setTimeout这个异步函数执行完毕后再执行后面的return flag;
,请问怎么实现呢?
天蓬老师2017-04-11 13:03:13
“异步”,这个概念就是让某个函数先不要执行... 你所说的肯定没法直接实现。
如果你是要拿到异步结果的话,可以考虑回调函数,也可以考虑使用ES2016的async和await
伊谢尔伦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);
大家讲道理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;
}
}
// 编译器会报错,没有在所有的条件判断中返回值,函数可能返回空值
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
})
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);
})