ChatGPT解决这个技术问题 Extra ChatGPT

从 setTimeout 获取返回值 [重复]

这个问题在这里已经有了答案:如何从异步调用返回响应? (43 个回答) 2 年前关闭。

我只想从 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));

r
rajniszp

为此,您需要使用 Promises。它们是 available in ES6,但可以填充 quite easily

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

实际上,我的示例中的 done 是一个需要在 setTimeout 内返回的承诺。因为我无法在 setTimeout 内获得返回的 deferred.resolve()。会怎么样?谢谢你
您能否在问题中发布更清晰的代码示例?
Q
Quentin

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

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

无论您想对获得的值做什么,都需要通过传递给 setTimeout 的函数来完成。

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

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

x();

M
Mritunjay

最好为函数 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 之后,“完成”将永远不会完成。
S
Satyabrata Saha

您可以使用 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);
        })


    });
}

t
tuan huynh

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

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

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