如何在Node js中并行执行云查询



我试图并行执行两个查询。在这里,我可以执行一个查询并获得结果。

doGet : async (request, response) => {
var usersState = [];
var names = { "usersState": usersState, "message": "ok" };
const queryForCricket = CloudantV1.Selector = {
"hoby": "Cricket"
};
const queryForChess = CloudantV1.Selector = {
"hoby": "Chess"
};
var query1 = {
db: dbName,
selector: queryForCricket,
fields: ["_id", "name", "hoby" ],
limit: 50,
skip: 0
};
var query2 = {
db: dbName,
selector: queryForChess,
fields: ["_id", "name", "hoby" ],
limit: 50,
skip: 0
};
service.postFind(query1).then(data => {
data.result.docs.forEach(function (doc) {
if(doc) usersState.push(doc);
}
response.send(names);
});
}

我试图并行执行第二个查询,但它没有按预期工作。对于下面的代码片段,出现类似"error: unhandled rejection: TypeError: fn is not a function"的错误。我不确定这是不是正确的方法。

async.parallel(
[
service.postFind(query1),
service.postFind(query2),
], function (err, results) {
if (err) {
response.send({ "message": "Get operration failed" });
return;
} else {
results.forEach(function (body) {
body[0].docs.forEach(function (doc) {
if (doc) usersState.push(doc);
});
});
response.json(names);
}
);

我看到你正在使用async函数,所以使用async/await语法更容易:

// in series
const res1 = await service.postFind(query1)
const res2 = await service.postFind(query2)

// in parallel
const results = await Promise.all([
service.postFind(query1),
service.postFind(query2)
])

看到Promise.all。