考虑这段代码
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;
答案 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());