从setTimeout获取返回值

Get return value from setTimeout

本文关键字:返回值 获取 setTimeout      更新时间:2023-09-26

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

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

您需要为此使用Promises。它们在ES6中可用,但可以很容易地填充:

function x() {
   return new Promise((resolve, reject) => {
     setTimeout(() => {
       resolve('done!');
     });
   });
}
x().then((done) => {
  console.log(done); // --> 'done!'
});

对于ES2017中的async/await,如果在async函数中就会变得更好:

async function() {
  const result = await x();
  console.log(result); // --> 'done!';
}

您无法从传递给setTimeout的函数中获得返回值。

调用setTimeout的函数(在您的示例中是x)将在您传递给setTimeout的函数被调用之前完成执行并返回。

无论你想对你得到的值做什么,你都需要从你传递给setTimeout的函数中去做。

在您的示例中,它将被写成:

function x () {
    setTimeout(function () {
        console.log("done");
    }, 1000);
}
x();

最好对函数x进行回调,并且在超时后要执行的任何任务都要发送回调。

function x (callback) {
    setTimeout(function () {
        callback("done");
    }, 1000);
}
x(console.log.bind(console)); //this is special case of console.log
x(alert) 

你可以像下面的例子一样使用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);
        })

    });
}

我认为你需要有标志知道事件发生与否。setTimeout没有返回值。您可以使用一个变量来检测事件是否发生

var y="notdone";
   setTimeout(function () {
         y="done";
    }, 1000);

您可以在超时发生后访问变量y以知道是否完成