Получить возвращаемое значение из setTimeout

Я просто хочу получить возвращаемое значение из setTimeout, но я получаю полный текстовый формат функции?

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

console.log(x());

Ответы

Ответ 1

Вы должны использовать Обещания для этого. Они доступны в ES6, но может быть polyfilled довольно легко:

function x() {
   var promise = new Promise(function(resolve, reject) {
     window.setTimeout(function() {
       resolve('done!');
     });
   });
   return promise;
}

x().then(function(done) {
  console.log(done); // --> 'done!'
});

С помощью async/await в ES2017 становится лучше, если внутри async функции:

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

Ответ 2

Вы не можете получить возвращаемое значение из функции, которую вы передаете, в setTimeout.

Функция, которая вызвала setTimeout (x в вашем примере), завершит выполнение и вернется, прежде чем функция, которую вы передадите на setTimeout, даже вызывается.

Что бы вы ни делали со значением, которое вы получаете, вам нужно сделать это от функции, которую вы передаете на setTimeout.

В вашем примере это будет написано как:

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

x();

Ответ 3

Лучше выполнить обратный вызов для функции x и любую задачу, которую вы хотите выполнить после этого тайм-аута, отправить этот обратный вызов.

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

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

Ответ 4

Я думаю, вы хотите иметь флаг, чтобы знать, что произошло событие или нет. setTimeout не возвращает значение. вы можете использовать переменную для обнаружения события или нет

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

Вы можете получить доступ к переменной y после таймаута, чтобы узнать, что сделано или нет

Ответ 5

Вы можете использовать комбинацию 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);
        })


    });
}