Lodash:是否可以使用具有异步功能的地图?

时间:2017-11-01 23:55:24

标签: javascript async-await lodash

考虑这段代码

const webpack = require('webpack');

const plugins = new webpack.ProvidePlugin({
    $: "jquery",
    _: "underscore"
});

module.exports = {
    entry: {
        app: './src/main/app/components/main.module.js',
        vendor: [
            'jquery',
            'underscore'
        ]
    },
    output: {
        filename: './src/main/resources/dist/app/scripts/[name].bundle.js',
    },
    plugins: [plugins],
    devtool: 'inline-source-map'
};

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 }); } (或其他系统)来循环整个responseJson数组以对每个元素使用_.map

我试过了:

addEnabledProperty

但它没有使用异步,所以它冻结了应用程序。

我试过了:

responseJson = _.map(responseJson,  function(channel) {
            return addEnabledProperty(channell);
        });

但是我得到了一个js错误(关于行responseJson = _.map(responseJson, function(channel) { return await addEnabledProperty(chanell); });

  

await是一个保留字

然后尝试了

return await addEnabledProperty(chanell);

但我得到了一系列的承诺......我不明白为什么......

还有什么!??

编辑:我理解您的抱怨,我没有指定responseJson = _.map(responseJson, async function(channel) { return await addEnabledProperty(channell); }); 返回addEnabledProperty(),但是,实际上,我并不知道。事实上,我写了#34; 我得到了一系列的承诺......我不明白为什么&#34;

4 个答案:

答案 0 :(得分:28)

要同时处理您的回复jsons,您可以使用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));

答案 1 :(得分:0)

您可以使用Promise.all()来运行阵列中的所有承诺。

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

答案 2 :(得分:0)

我发现我不必将npm install封装器中的async / await放入其中。

使用该知识,结合lodash链(Promise.all)可能会产生以下简化版本的接受答案:

_.chain

答案 3 :(得分:0)

如何使用partial.js(https://github.com/marpple/partial.js

它用相同的代码覆盖了承诺模式和正常模式。

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