我试图平行地调用相同的功能,但有不同的争论。我使用了Promise.all,但似乎没有平行地执行任务。我尝试使用蓝鸟,但似乎执行只是顺序发生。 PFB代码和日志的片段。
let records = await getRecords(query);
if (_.size(records) > 0) {
bluebird.map(records, function (record) {
return prepareFileContent(record.MESSAGE_PAYLOAD);
}, { concurrency: records.length }).then(function (data) {
finalData = data;
console.log("done");
});
}
export async function prepareFileContent(payload : string) : Promise<string>{
return new Promise<string>(function(resolve,reject){
try{
console.log("content generation starts");
//logic goes here
console.log("content generation ends");
resolve(details);
}
catch(err)
{
log.error("Error in parsing the payload:", err);
reject(err);
}
});`
日志看起来像这样,表明它们是按顺序而不是并行执行的。 (从这时起,每个人执行需要4秒钟)
2018-04-16T08:47:53.095Z content generation starts
2018-04-16T08:47:57.819Z content generation ends
2018-04-16T08:47:57.820Z content generation starts
2018-04-16T08:48:02.253Z content generation ends
2018-04-16T08:48:02.254Z content generation starts
2018-04-16T08:48:06.718Z content generation ends
2018-04-16T08:48:06.718Z content generation starts
2018-04-16T08:48:11.163Z content generation ends
2018-04-16T08:48:11.163Z content generation starts
2018-04-16T08:48:15.573Z content generation ends
2018-04-16T08:48:15.574Z content generation starts
有人可以帮我解决如何实现同样的问题以及我在这里缺少什么?
答案 0 :(得分:1)
首先,node.js Javascript是单线程的。因此,没有两个Javascript真正并行运行。当人们谈到并行运行的事情时,这只适用于具有本机代码组件的异步操作,例如网络操作,文件操作等......
您似乎在假设像Bluebird的Promise.map()
这样的承诺和功能启用并行操作的情况下运行。只有当您使用promises(在您的示例中使用prepareFileContent()
函数)监视的基础操作实际上能够在Javascript解释器之外自行运行时,才会出现这种情况。但是,您向我们展示的函数prepareFileContent()
中的代码只是Javascript,因此它无法与其他任何内容并行运行。请记住,node.js运行您的Javascript单线程,因此它无法同时运行两个Javascript。
因此,您的输出完全符合预期。 bluebird.map()
遍历数组,在数组中的每个项目上调用回调并从每个函数调用中收集一个promise。然后,它等待所有承诺完成并将所有已解析的结果收集到一个数组中。
但是,每个回调都是同步的。他们没有任何异步部分,因此所有代码最终都会同步运行。没有什么是并行的。