SetTimeoutから戻り値を取得したいのですが、取得できるのは関数のテキスト形式全体ですか?
function x () {
setTimeout(y = function () {
return 'done';
}, 1000);
return y;
}
console.log(x());
これにはPromiseを使用する必要があります。これらは 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!'
});
ES_2017でasync
/await
を使用すると、async
関数内にあるとより良くなります。
async function() {
const result = await x();
console.log(result); // --> 'done!';
}
setTimeout
に渡す関数から戻り値を取得することはできません。
setTimeout
(この例ではx
)を呼び出した関数は、setTimeout
に渡す関数が呼び出される前に実行を終了して戻ります。
取得した値をどのように使用する場合でも、setTimeout
に渡す関数から実行する必要があります。
あなたの例では、それは次のように書かれます:
function x () {
setTimeout(function () {
console.log("done");
}, 1000);
}
x();
関数x
のコールバックを取得し、そのタイムアウト後に実行するタスクをコールバックで送信する方が適切です。
function x (callback) {
setTimeout(function () {
callback("done");
}, 1000);
}
x(console.log.bind(console)); //this is special case of console.log
x(alert)
以下の例のように、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);
})
});
}
イベントが発生したかどうかを知らせるフラグが必要だと思います。 setTimeoutは値を返しません。変数を使用して、発生したイベントまたはそうでないイベントを検出できます
var y="notdone";
setTimeout(function () {
y="done";
}, 1000);
タイムアウトが発生した後、完了したかどうかを知るために変数yにアクセスできます。