6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

javascriptで一定時間処理を停止する

Last updated at Posted at 2020-03-10

はじめに

初学者による初学者向けの記事となります。

筆者が初学者のため、正しくない記述も含まれているかもしれません。
また、1つ1つの説明を省略しています。
本記事を読んで、その場を乗り切った後、
しっかりと Promise, async / await について勉強することを推奨します。
末尾の参考記事を参照してください。

javascript の Promise, async / await を勉強し始めました。

await の記述方法が直感的でとても気に入ったので、
いつも await で記述したかったのですが、
記述できるときと記述できないときがあります。

本記事では、「一定時間処理を停止する」という具体例をもとに、
知見を共有したいと思います。

※javascriptで処理の停止はできないため、
 正しくは、 一定時間後にコールバックする という表現になります。

まとめ

await を使って一定時間処理を停止したい場合は、
一定時間処理を停止したい場所がasyncの関数内かどうか
を確認する。

await は async の関数内でしか使用することができません。

一定時間処理停止(疑似)

サンプル

CodePenにサンプルを作成しました。
https://codepen.io/sonoshou/pen/RwPxyVB

asyncの関数内かどうか

本記事では、以下のように定義しています。

asyncの関数内

async function () {
  /* asyncの関数内 */
}

asyncの関数内ではない

function () {
  /* asyncの関数内ではない */
}

asyncの関数内のsleep処理

function mySleep(time) {
  return new Promise( (resolve) => {
    setTimeout(resolve, time)
  })
}

async function asyncMyFunc() {
  console.log("asyncMyFunc:1")
  /* ここで一定時間処理を停止することを考える。 */
  /* asyncの関数内なので、awaitを使う。 */
  await mySleep(2000)  // 2000ミリ秒停止
  /* 停止した以降の処理を記述する。 */
  console.log("asyncMyFunc:2")
}

asyncMyFunc()を実行すると、以下の通り出力される。

asyncMyFunc:1
asyncMyFunc:2

asyncの関数内ではないsleep処理

function mySleep(time) {
  return new Promise( (resolve) => {
    setTimeout(resolve, time)
  })
}

function myFunc() {
  console.log("myFunc:1")
  /* ここで一定時間処理を停止することを考える。 */
  /* asyncの関数内ではないので、awaitを使わず記述する。 */
  mySleep(2000).then( () => {
    /* 停止した以降の処理を記述する。 */
    console.log("myFunc:2")
  })
  console.log("continue...")
}

myFunc()を実行すると、以下の通り出力される。

myFunc:1
continue...
myFunc:2

一定時間処理を停止したい方にとっては、
continue... は処理されてほしくないですね。

したがって、

  mySleep(2000).then( () => {
    /* 停止した以降の処理を記述する。 */
    console.log("myFunc:2")
  })

こちらに記述する必要があります。

asyncの関数内ではないsleep処理の別解

asyncの即時関数を使えば、awaitは使えます。
こちらの使用も検討しましょう。
しかし、結局、ネストは増えてしまいます。

function mySleep(time) {
  return new Promise( (resolve) => {
    setTimeout(resolve, time)
  })
}

function myFuncAsync() {
  console.log("myFuncAsync:1");
  /* ここで一定時間処理を停止することを考える。 */
  (async () => {
    await mySleep(2000)
    /* 停止した以降の処理を記述する。 */
    console.log("myFuncAsync:2")
  })();
  console.log("continue...")
}

myFuncAsync()を実行すると、以下の通り出力される。

myFunc:1
continue...
myFunc:2

参考記事

6
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?