このコードを検討してください
_const response = await fetch('<my url>');
const responseJson = await response.json();
responseJson = _.sortBy(responseJson, "number");
responseJson[0] = await addEnabledProperty(responseJson[0]);
_
addEnabledProperty
が行うことは、enabled
プロパティを追加してオブジェクトを拡張することですが、これは重要ではありません。関数自体はうまく機能します
_async function addEnabledProperty (channel){
const channelId = channel.id;
const stored_status = await AsyncStorage.getItem(`ChannelIsEnabled:${channelId}`);
let boolean_status = false;
if (stored_status == null) {
boolean_status = true;
} else {
boolean_status = (stored_status == 'true');
}
return _.extend({}, channel, { enabled: boolean_status });
}
_
__.map
_(または別のシステム)を使用してresponseJson配列全体をループして各要素に対してaddEnabledProperty
を使用する方法はありますか?
私は試した:
_responseJson = _.map(responseJson, function(channel) {
return addEnabledProperty(channell);
});
_
ただし、非同期を使用していないため、アプリがフリーズします。
私は試した:
_responseJson = _.map(responseJson, function(channel) {
return await addEnabledProperty(chanell);
});
_
しかし、私はjsエラーを得ました(行return await addEnabledProperty(chanell);
について)
awaitは予約語です
それから試した
_responseJson = _.map(responseJson, async function(channel) {
return await addEnabledProperty(channell);
});
_
しかし、私は約束の配列を得ました...そして、私は理由を理解していません...
ほかに何か!??
[〜#〜] edit [〜#〜]:addEnabledProperty()
がPromise
を返すように指定しなかったという不満を理解していますが、実際には、知りませんでした。実際、「私は約束の配列を手に入れました...そして理由がわかりません」
応答jsonを並行して処理するには、Promise.all
:
const responseJson = await response.json();
responseJson = _.sortBy(responseJson, "number");
let result = await Promise.all(_.map(responseJson, async (json) =>
await addEnabledProperty(json))
);
addEnabledProperty
メソッドは非同期であるため、以下も動作するはずです(@CRiceごと):
let result = await Promise.all(_.map(responseJson, addEnabledProperty));
Partial.js( https://github.com/marpple/partial.js )の使用方法について
同じコードでプロミスと通常のパターンの両方をカバーします。
_p.map([1, 2, 3], async (v) => await promiseFunction());
Promise.all()
を使用して、配列内のすべてのプロミスを実行できます。
responseJson = await Promise.all(_.map(responseJson, (channel) => {
return addEnabledProperty(channel);
}));
Promise.all
ラッパー内にasync/awaitを置く必要がないことがわかりました。
その知識をlodashチェーン(_.chain
)と組み合わせて使用すると、受け入れられた回答の次の単純化されたバージョンが得られる可能性があります。
const responseJson = await Promise.all( _
.chain( response.json() )
.sortBy( 'number' )
.map( json => addEnabledProperty( json ) )
.value()
)