我只想从setTimeout获取返回值,但我得到的是函数的全文格式?
function x () {
setTimeout(y = function () {
return 'done';
}, 1000);
return y;
}
console.log(x());
答案 0 :(得分:54)
你需要使用Promises。它们是available in ES6但可以填充quite easily:
function x() {
var promise = new Promise(function(resolve, reject) {
window.setTimeout(function() {
resolve('done!');
});
});
return promise;
}
x().then(function(done) {
console.log(done); // --> 'done!'
});
在ES2017中使用async
/ await
,如果在async
函数内部变得更好:
async function() {
const result = await x();
console.log(result); // --> 'done!';
}
答案 1 :(得分:12)
您无法从传递给setTimeout
的函数中获取返回值。
调用setTimeout
(在您的示例中为x
)的函数将在您传递给setTimeout
的函数被调用之前完成执行并返回。
无论您想要获得什么样的价值,都需要从传递给setTimeout
的函数中完成。
在您的示例中,这将写为:
function x () {
setTimeout(function () {
console.log("done");
}, 1000);
}
x();
答案 2 :(得分:2)
最好对函数x
进行回调,并在该超时后发送任何要执行的任务。
function x (callback) {
setTimeout(function () {
callback("done");
}, 1000);
}
x(console.log.bind(console)); //this is special case of console.log
x(alert)
答案 3 :(得分:0)
我认为您希望有标志知道事件发生或没有。 setTimeout不返回值。您可以使用变量来检测发生的事件或没有
var y="notdone";
setTimeout(function () {
y="done";
}, 1000);
您可以在发生超时后访问变量y以了解是否已完成
答案 4 :(得分:0)
您可以使用Promise和setTimeOut的组合,如下例所示
let f1 = function(){
return new Promise(async function(res,err){
let x=0;
let p = new Promise(function(res,err){
setTimeout(function(){
x= 1;
res(x);
},2000)
})
p.then(function(x){
console.log(x);
res(x);
})
});
}