【问题标题】:Get return value from setTimeout [duplicate]从 setTimeout 获取返回值 [重复]
【发布时间】:2014-09-15 17:18:42
【问题描述】:

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

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

console.log(x());

【问题讨论】:

  • 你的语法是这样的,它只会返回函数。
  • 您希望返回“完成”吗?如何返回函数的结果,它会在 1000 毫秒后调用?
  • 超时是异步的,所以你不能从它们返回。 (嗯,你可以,但返回值无处可去)
  • 最好在函数x 中获得回调并使用done 调用该函数。
  • const x = async (waitMs) => new Promise((resolve) => setTimeout(() => resolve('done'), waitMs)); console.log(await x(1000));

标签: javascript return settimeout return-value


【解决方案1】:

您需要为此使用 Promise。它们是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!';
}

【讨论】:

  • 实际上,我的示例中的 done 是一个需要在 setTimeout 中返回的承诺。因为我无法在 setTimeout 中获得返回的 deferred.resolve()。会怎么样?谢谢
  • 您能否在问题中发布更清晰的代码示例?
【解决方案2】:

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

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

无论您想对获得的值做什么,都需要从传递给setTimeout 的函数中执行。

在您的示例中,可以写成:

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

x();

【讨论】:

  • 问题询问如何“返回”一个值。您的函数实际上并没有返回任何内容,而是执行了一个 console.log 函数。
  • @kaizer1v — 那是因为返回值是不可能的(因为我花了答案的前两段来解释)。
【解决方案3】:

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

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

x(console.log.bind(console)); //this is special case of console.log
x(alert) 

【讨论】:

  • 请记住,这不会在函数调用之后等待,因此它实际上可能不会发生。例如添加 process.exit,在调用 x 之后,"done" 将永远不会完成。
【解决方案4】:

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


    });
}

【讨论】:

    【解决方案5】:

    我认为您希望有标志来知道事件是否发生。 setTimeout 不返回值。您可以使用变量来检测事件是否发生

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

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

    【讨论】:

      猜你喜欢
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2018-07-31
      • 2018-09-08
      相关资源
      最近更新 更多