从setTimeout获取返回值

时间:2014-07-24 08:35:07

标签: javascript return settimeout

我只想从setTimeout获取返回值,但我得到的是函数的全文格式?

function x () {
    setTimeout(y = function () {
        return 'done';
    }, 1000);
    return y;
}

console.log(x());

5 个答案:

答案 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);
        })


    });
}