2017-11-21 8 views
0

現在、短い文字列をキーとして格納しています。Async Awaitが期待どおりに機能しない

これらのキーは、ラベルである長い値に対応します。

対応するキーの長い値を更新しようとしています。

しかし、console.log(レコード)は常に最初に実行され、内部のlog文は実行されないものが実行されます。変更されていないレコードを常にgetRadioValues関数呼び出し側に送信します。

対応するキーが更新された後にレコードを返したいとします。

export const getRadioValues = (record: IRecordInput) => { 
    const singleSelectKeys = ['Race', 'DeathWas', 'MannerOfDeath']; 
    singleSelectKeys.forEach(async key => { 
     if (record[key]) { 
      const dropDownOption = await DropDownOptions.find({ where: { id: record[key] }}) as IPDFSelect; 
      record[key] = dropDownOption.dataValues.Text; 
      console.log(record[key]); 
     } 
    }); 
    console.log(record); 
    return record; 
}; 

答えて

1

あなたforEachは、ループは、おそらくそれを行うに作成約束のいずれかの前に終了したことを意味し、非同期機能を使用しています。これを解決するには、約束の結果を得て、それを待たなければなりません。しかし、これは囲み関数自体が非同期でなければならないことを意味し、実際のユースケースでは許容される場合と受け入れられない場合があります。

export const getRadioValues = async (record: IRecordInput) => { 
    const singleSelectKeys = ['Race', 'DeathWas', 'MannerOfDeath']; 
    await Promise.all(singleSelectKeys.map(async key => { 
     if (record[key]) { 
      const dropDownOption = await DropDownOptions.find({ where: { id: record[key] }}) as IPDFSelect; 
      record[key] = dropDownOption.dataValues.Text; 
      console.log(record[key]); 
     } 
    })); 
    console.log(record); 
    return record; 
}; 
+0

'あなたの実際の使用例では受け入れられないかもしれません。' - 受け入れ可能性は無関係です。 'getRadioValues'によって返される結果は非同期であるため、非同期関数として使用する必要があります(約束を返す場合でも' async'でなくてもかまいません)。 –

+0

当初は、Promise以外で提案したのと同じコードを使用しようとしました。すべての機能。非同期が約束を解決するのを待っているのではないでしょうか? –

+0

はい、コールバック内 –

関連する問題