Получить возвращаемое значение из 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);
})
});
}