提问者:小点点

从setTimeout[重复]获取返回值


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

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

console.log(x());

共3个答案

匿名用户

你需要用承诺来做这件事。它们在ES6中可用,但可以很容易地进行多填充:

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!';
}

匿名用户

您无法从传递给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)