web-dev-qa-db-ja.com

setTimeoutから戻り値を取得する

SetTimeoutから戻り値を取得したいのですが、取得できるのは関数のテキスト形式全体ですか?

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

console.log(x());
40
Vainglory07

これには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!';
}
59
Matt Clarkson

setTimeoutに渡す関数から戻り値を取得することはできません。

setTimeout(この例ではx)を呼び出した関数は、setTimeoutに渡す関数が呼び出される前に実行を終了して戻ります。

取得した値をどのように使用する場合でも、setTimeoutに渡す関数から実行する必要があります。

あなたの例では、それは次のように書かれます:

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

x();
13
Quentin

関数xのコールバックを取得し、そのタイムアウト後に実行するタスクをコールバックで送信する方が適切です。

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

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

以下の例のように、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);
        })


    });
}
0
Satyabrata Saha

イベントが発生したかどうかを知らせるフラグが必要だと思います。 setTimeoutは値を返しません。変数を使用して、発生したイベントまたはそうでないイベントを検出できます

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

タイムアウトが発生した後、完了したかどうかを知るために変数yにアクセスできます。

0
tuan huynh