意図は
『setTimeout を使って、async 関数を止めたい』
だと思っています。
sampleResolve 関数と sampleResolve2 関数は
Premise 型を返す関数として定義されていますが、
この二つの関数をAsyncで書き直すことはできるのでしょうか?
結論
残念ながら、できません。
理由
setTimeout は Promise 型のオブジェクトを返さないからです。
async 関数は、await 文を使って止めることができます(処理が完了するのを待つことができます)。
なぜなら async 関数は Promise 型のオブジェクトを返してくれるからです。
ここで大事なのは
await 文で止めることができるのは Promise 型のオブジェクトだけ
だと言うことです。
問題
①
setTimeout 関数が返すオブジェクトの型は、次のうちどれですか?
- Undefined 型のオブジェクト
- Promise 型のオブジェクト
- Number 型のオブジェクト
②
以下のコードをコンソールにコピペして実行したとき...
js
1async function main() {
2 let start, end
3
4 start = Date.now()
5 await f()
6 end = Date.now()
7 console.log(end - start) // <--- 実行結果 1
8
9 start = Date.now()
10 await g()
11 end = Date.now()
12 console.log(end - start) // <--- 実行結果 2
13}
14
15async function f() {
16 await sleep(1000)
17 await sleep(1000)
18 await sleep(1000)
19}
20
21async function g() {
22 const promise0 = sleep(1000);
23 const promise1 = sleep(1000);
24 const promise2 = sleep(1000);
25 await promise0;
26 await promise1;
27 await promise2;
28}
29
30function sleep(time) {
31 return new Promise((resolve, reject) => {
32 setTimeout(() => {
33 resolve()
34 }, time)
35 })
36}
37
38main()
console.log の実行結果 1, 2 に表示される組み合わせとして
もっとも近いものは、次のうちどれですか?
なお表示される結果は完全には、一致しません。だいたいの値です。
選択肢 | 実行結果 1 | 実行結果 2 |
---|
1 | 1000 | 1000 |
2 | 1000 | 3000 |
3 | 3000 | 1000 |
4 | 3000 | 3000 |
解答
①
正解は 3 番です。
setTimeout は Promise 型のオブジェクトを返しません。
なので await 文で止めることができません。
javascript
1const type = (object) => Object.prototype.toString.call(object).slice(8, -1)
2type(setTimeout(()=>{}, 0))
> type(setTimeout(()=>{}, 0))
"Number"
>
②
正解は 3 番です。
補足
① Promise は setTimeout で主に使い、他ではあまり使わない
らしいです。以下の記事がとても勉強になります。
ただ、new Promise(...)と、Promiseの前にnewを付ける書き方も、
最後にコールバックを受け取る関数以外(setTimeoutとか)を扱う以外は
基本的に使うことはほとんどないでしょう。
イマドキのJavaScriptの書き方2018 - Qiita
② sleep の実装
async 関数を止める sleep させるような処理を以下のような具合で書けるらしいです。
個人的に勉強になったので付記しておきます。
javascript
1const sleep = () => new Promise(resolve => setTimeout(resolve, 3000))
まとめ
async 関数の中で、非同期処理を途中で止めることができるのは await 文だけです。
await 文で、止められるのは Promise 型のオブジェクトだけです。
setTimeout は
Promise 型のオブジェクトを返さず Number 型のオブジェクトを返します。
そのため await 文で処理を止めることができず、突き抜けていってしまいます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/18 16:08
2019/11/19 03:43 編集
2019/11/19 05:51