web-dev-qa-db-ja.com

非同期関数を呼び出す方法

コンソールに最初に「1」を出力させたいのですが、非同期関数を呼び出してコードの次の行に進む前にその実行を待つ方法がわかりません。

const request = require('request');

async function getHtml() 
{
    await request('https://google.com/', function (error, response, body) {
    console.log('1');
  });

}

getHtml();
console.log('2');

もちろん、私が得ている出力は

2
1
9
chris

async_function MDN に従って

戻り値

非同期関数によって返された値で解決されるか、非同期関数内からスローされたキャッチされない例外で拒否されるPromise。

非同期関数は常にプロミスを返し、その値にアクセスするには.then()またはawaitを使用する必要があります

async function getHtml() {
  const request = await $.get('https://jsonplaceholder.typicode.com/posts/1')  
  return request
}

getHtml()
  .then((data) => { console.log('1')})
  .then(() => { console.log('2')});
  
// OR 

(async() => {
  console.log('1')
  await getHtml()  
  console.log('2')
})()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
14
Taki

関数の前にasyncキーワードを置くと、非同期関数になります。これは基本的に関数に対して2つのことを行います。

  1. 関数がプロミスを返さない場合、JSエンジンはこの値を解決済みプロミスにラップします。したがって、関数は常にpromiseを返します。
  2. この関数内でawaitキーワードを使用できます。 awaitキーワードを使用すると、Promiseが解決されるのを「待つ」ことができます。これにより、非同期コードを同期的に作成できます。たとえば、 このチュートリアル

あなたの例では、JSアプリケーションでは常に非同期コードの前に同期コードが最初に終了するため、console.log(2)は常に最初に終了します。プロミスは常に非同期であるため、名前が非同期を意味するため、async機能です。詳細については、 イベントループ をご覧ください。

1

続行する前に.then()を使用する前に、await非同期関数を解決する必要があります。

await getHtml();
console.log('2');

または

getHtml()
 .then(() => {
    console.log('2');
 });
0
h1b9b