从setTimeout获取返回值

Vai*_*y07 51 javascript return settimeout

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

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

console.log(x());
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 63

你需要使用Promises.它们在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!'
});
Run Code Online (Sandbox Code Playgroud)

使用async/ await在ES2017中,如果在async函数内部变得更好:

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

  • 你能在问题中发布一个更清晰的代码示例吗? (3认同)

Que*_*tin 15

您无法从传递的函数中获取返回值setTimeout.

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

无论你想要做什么,你需要从传递的功能中做到这一点setTimeout.

在您的示例中,这将写为:

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

x();
Run Code Online (Sandbox Code Playgroud)

  • 问题询问如何“返回”一个值。您的函数实际上并不返回任何内容,而是执行 console.log 函数。 (13认同)
  • @kaizer1v - 那是因为不可能返回该值(正如我用答案的前两段解释的那样)。 (6认同)

Mri*_*jay 6

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

function x (callback) {
    setTimeout(function () {
        callback("done");
    }, 1000);
}

x(console.log.bind(console)); //this is special case of console.log
x(alert) 
Run Code Online (Sandbox Code Playgroud)

  • 请记住,这不会在函数调用后等待,因此实际上可能不会发生。例如添加 process.exit,调用 x 后,“done”将永远不会完成。 (2认同)