我是NodeJS的新手,我对它的异步默认特性感到困惑。
假设我有一个人们发送字符串的API:
Health Initiatives
Global Steel Slate
Vera Cruz Taste Bud Delight
我需要获取数据库中包含任何这些单词的所有文档。所以我需要为第一个字符串做2个数据库查询,为第二个字符串做3个数据库,对最后一个字符串进行5个查询。
我不明白我的代码应该如何看待。在像PHP这样的语言中,我只需将字符串分解为数组,然后遍历数组,进行数据库调用,然后聚合结果,然后将结果发送给调用API的人。所以在PHP中:
$results = array();
$pieces = explode(" ", "Global Steel Slate");
for ($i=0; $i < count($pieces); $i++) {
$piece = $pieces[$i];
$document = database_call($piece);
array_push($results, $document);
}
return $results;
我如何在NodeJS中处理这种情况?如何进行任意数量的数据库调用然后聚合结果?
答案 0 :(得分:2)
对于这种特定情况,您可以在一个查询中执行此操作:
select * from mytable where
mydata like '%Health%' or
mydata like '%Initiatives%' or
mydata like '%Global%' or
mydata like '%Steel%' or
mydata like '%Slate%' or
mydata like '%Vera%' or
mydata like '%Cruz%' or
mydata like '%Taste%' or
mydata like '%Bud%' or
mydata like '%Delight%';
顺便说一下,这也会显着改善PHP代码。
为了处理多个异步操作,async.js库涵盖了所有可能的设计模式:https://www.npmjs.com/package/async或者您更喜欢promises基于promise的async-q库(它实现了异步中的大多数功能)。 js):https://www.npmjs.com/package/async-q
例如,如果您想要并行查询所有这些单词,请使用async.js:
async.each([
'Health','Initiatives','Global',
'Steel','Slate', 'Vera', 'Cruz',
'Taste', 'Bud', 'Delight'
], asyncFunction, doneFunction)
如果您想将其限制为3个连接,您可以这样做:
async.eachLimit([
'Health','Initiatives','Global',
'Steel','Slate', 'Vera', 'Cruz',
'Taste', 'Bud', 'Delight'
], 3, asyncFunction, doneFunction)
如果每个请求都将数据提供给下一个请求async.waterfall
,如果您希望一次处理一个异步流程async.eachSeries
等。
答案 1 :(得分:0)
为什么你不做同样的事情?首先,您将使用哪个数据库?
您可以接收一个字符串并将其拆分,然后并行执行多个数据库查询(速度更快)
const words = value.split(' ');
const listOfQueries = words.map((word) => {
return database.query('SQL QUERY word'); //should return a promise
});
const results = await Promise.all(listOfQueries);
或者你可以做到顺序:
const words = value.split(' ');
let results = [];
for(let i = 0; i < words.length; ++i) {
results.push(await database.query('SQL QUERY word')); //should return a promise
}
//DO stuff with results...
我希望它有所帮助:)
由于您是Node.js中的新手,并且您可能正在使用MySql,我建议您使用knex.js + Mysql驱动程序(http://knexjs.org/ + https://github.com/mysqljs/mysql),它的完全承诺是兼容的!