1. ホーム
  2. Web プログラミング
  3. ジャバスクリプト

[解決済み】awaitは非同期関数でのみ有効です。

2021-12-28 13:18:34

質問

モジュールをラップしました。 lib/helper.js

var myfunction = async function(x,y) {
   ....
   return [variableA, variableB]
}
exports.myfunction = myfunction;

このモジュールを別のファイルで参照しました

 var helper = require('./helper.js');   
 var start = function(a,b){
     ....
     const result = await helper.myfunction('test','test');
 }
 exports.start = start;

しかし、次のようなエラーが発生します。

"await is only valid in async function"

解決方法は?

を参照しているわけではありません。 myfunction でなく start .

async function start() {
   ....

   const result = await helper.myfunction('test', 'test');
}


// My function
const myfunction = async function(x, y) {
  return [
    x,
    y,
  ];
}

// Start function
const start = async function(a, b) {
  const result = await myfunction('test', 'test');
  
  console.log(result);
}

// Call start
start();



この質問をきっかけに、以下を使った既知のアンチパターンについてアドバイスします。 await ということです。 return await .


WRONG

async function myfunction() {
  console.log('Inside of myfunction');
}

// Here we wait for the myfunction to finish
// and then returns a promise that'll be waited for aswell
// It's useless to wait the myfunction to finish before to return
// we can simply returns a promise that will be resolved later

// useless async here
async function start() {
  // useless await here
  return await myfunction();
}

// Call start
(async() => {
  console.log('before start');

  await start();
  
  console.log('after start');
})();


正解

async function myfunction() {
  console.log('Inside of myfunction');
}

// Here we wait for the myfunction to finish
// and then returns a promise that'll be waited for aswell
// It's useless to wait the myfunction to finish before to return
// we can simply returns a promise that will be resolved later

// Also point that we don't use async keyword on the function because
// we can simply returns the promise returned by myfunction
function start() {
  return myfunction();
}

// Call start
(async() => {
  console.log('before start');

  await start();
  
  console.log('after start');
})();


また、以下のような特殊なケースもあることを知っておいてください。 return await が正しくて重要です : (try/catchを使用)

return await`でパフォーマンスの懸念はありますか?