7

関数を非同期にしたくなく、プロセスが終了するのを待ちたいだけです。
以下のコードを参照してください。
関数に await キーワードがあったため、getUserList を非同期にする必要がありました。したがって、メソッドを実行するには「await UsersService.getUserList」のように記述し、親関数を非同期にする必要もありました。それは私がやりたいことではありません。

import xr from 'xr' //a package for http requests

class UsersService {

  static async getUserList() {
    const res = await xr.get('http://localhost/api/users')
    return res.data
  }

}

export default UsersService

import UsersService from './UsersService'

class SomeClass {

  async someFunction() { //async again!!
    const users = await UsersService.getUserList() //await again!!
  }

}
4

1 に答える 1

10

それはデザインの選択ですか?

これは、JavaScript の同期的な性質によるものです。関数で非同期コマンドを同期的に実行する必要がある場合、プログラム全体がブロックされるため、これは非常に望ましくなく、クライアント側の場合は悪いことであり、サーバー側の場合は恐ろしいことです。このため、async関数が存在します。これらの機能は通常のフローから取り出されているため、機能しawaitます。

なんで?

もう 1 つの理由は、await+asyncがpromise の構文糖衣であることです。Promiseは非同期であり、それを止めることはできません。これが意味することは、await は async 関数を sync にしないということです。それは、終了するまで残りの await 関数を保持するだけです。イベント ループ全体がブロックされた場合、クライアント間でデータを送信するアプリを作成する場合を想像してみてください。単一の要求を非同期にするだけでなく、非同期要求を行うたびにサーバー アプリ全体がハングします。

したがって、次のように考えてください。

非同期関数を同期させるのではなく、それに対処するためにプログラムの残りの部分を非同期にします。

asyncしたがって、 の要件を考えるのではなくawait、それらを組み合わせ ( async+ await) と考えてください。async と await について詳しく知りたい場合は、これについて詳しく説明している私のブログ記事を読むことを強くお勧めします。

于 2016-07-12T05:46:26.347 に答える