web-dev-qa-db-ja.com

Lodash:非同期関数でマップを使用することは可能ですか?

このコードを検討してください

_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を返すように指定しなかったという不満を理解していますが、実際には、知りませんでした。実際、「私は約束の配列を手に入れました...そして理由がわかりません

13
realtebo

応答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));
32
dhilt

Partial.js( https://github.com/marpple/partial.js )の使用方法について

同じコードでプロミスと通常のパターンの両方をカバーします。

_p.map([1, 2, 3], async (v) => await promiseFunction());
0
Juneho Nam

Promise.all()を使用して、配列内のすべてのプロミスを実行できます。

responseJson = await Promise.all(_.map(responseJson, (channel) => {
        return addEnabledProperty(channel);
    }));
0
Rodrigo Leite

Promise.allラッパー内にasync/awaitを置く必要がないことがわかりました。

その知識をlodashチェーン(_.chain)と組み合わせて使用​​すると、受け入れられた回答の次の単純化されたバージョンが得られる可能性があります。

const responseJson = await Promise.all( _
                       .chain( response.json() )
                       .sortBy( 'number' )
                       .map( json => addEnabledProperty( json ) )
                       .value()
                     )
0
Javid Jamae