2017-10-26 29 views
4

私は現在、ウェブサイトのスロットマシンエフェクトに取り組んでいます。私は、setTimeout()で何回も呼び出す関数を使用します。私は減速する効果が必要なので、単純なループではなくsetTimeout()を使用します。これはミリ秒が便利な場所です。この後、私は別のパラメータで同じ機能を起動したい。だから私は最初の "ループ"が完了したときを知る必要があります。私はその約束を試みた。成功なし。javascript約束setTimeout

問題を単純化するために、以下のコードが.then()メソッドを起動しない理由を誰かに教えてください。私はこのすべてのプログラミングには新しく、これは私の最初の質問です。私はここで明らかに間違いがないことを願っています。

あなたは単純にそうように、再帰呼び出しの後に約束を解決する必要があり
function countDown(i) { 
    return promise = new Promise((resolve, reject) => { 

    console.log(i--); 

    if (i > 0) { 
     setTimeout(() => { 
     countDown(i); 
     }, 1000); 
    } else { 
     resolve('counter finished:'); 
    } 

    }); 

} 

let counter = countDown(10); 
counter.then((msg) => { 
    console.log(msg); 
}); 
+5

あなたは10個の約束を作成し、そして唯一の解決れることは決してありません拳1に待っているので。 – Keith

+1

最初の質問については、かなり書かれていると思います。ようこそ! 問題については、キースは正しいです。 –

+0

小さなヒント:ちょうど10秒で終了することはありません;状況によっては20以上になることもあります) – GottZ

答えて

5

function countDown(i) { 
 
    return promise = new Promise((resolve, reject) => { 
 

 
    console.log(i--); 
 

 
    if (i > 0) { 
 
     setTimeout(() => { 
 
     countDown(i).then(resolve); 
 
     }, 1000); 
 
    } else { 
 
     resolve('counter finished:'); 
 
    } 
 

 
    }); 
 

 
} 
 

 
let counter = countDown(10); 
 
counter.then((msg) => { 
 
    console.log(msg); 
 
});

+1

'countDown(i).then(resolve);' – Keith

+0

@Keithはい、 'resolve.bind(null、" counter finished ")'を実行しない限り、メッセージは添付されません。これは、より多くのキーストロークで終わると思います。 – mhodges

+1

皆さんありがとうございます。これは私のために働く。 <3 –

2

あなたがここにあなたの例は、async/awaitを使用してに見たいと思うかもしれませんこれを使って

古いブラウザをターゲットにする必要がある場合は、Babel/Typescriptなどを使用することもできますが、最新のブラウザでは既にこれをサポートしています。

function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)) } 
 

 
async function countDown(i) { 
 
    while (i > 0) { 
 
    console.log(i--); 
 
    await sleep(1000); 
 
    } 
 
    return "counter finished:"; 
 
} 
 

 
let counter = countDown(10); 
 
counter.then((msg) => { 
 
    console.log(msg); 
 
});