好吧,你的代码有几个问题,但是很容易解决如果你很小心的话,我会指导你解决它们。
第一个:
你是
要始终排队,这是在队列中获取相同数据的根本原因:
queries.push(req.body.searchTerm);
...
entities.forEach(entity => {
queries.push(entity.name);
resolve({ entity });
});
现在您的队列是
[1,2,3]
,作为第一个参数为1。
然后从以下位置重做查询逻辑:
async function onQueueSearch() {
for(i = 0; i < queries.length; i++) {
return await sentimentAnalyze(queries[i]);
}
if(queries.length === 0 ) {
console.log("queries length is zero...");
}
}
for循环的返回将中断循环并返回第一次执行,这将是
queries[0] === 1
因此,要解决此问题,请使用以下方法使数组保持先进先出:
queries.unshift(req.body.searchTerm);
entities.forEach(entity => {
queries.unshift(entity.name);
resolve({ entity });
});
这将使您的查询在到达[3,2,1]时保持有序,而不是[1,2,3],现在您可以使用
queries.pop()
相反。
queries.unshift(4);
queries.pop();
将情绪分析更改为:
async function onQueueSearch(){
if(queries.length === 0 ) {
console.log("queries length is zero...");
return;
}
return await sentimentAnalyze(queries.pop());
}
您正在使用一个iterval来连续调用查询,问题是:
setInterval(async function() {
results = await onQueueSearch();
}, 3000);
“估计”
重新执行前完成查询所需的时间。使用上面的unshift和pop查询,您可以完成这项工作,但是,您需要一个更优雅的解决方案。
带有NodeJS版本<10+:
const queries = [1];
let counter = 0;
async function reRunQueries(){
counter++;
console.log(`queries #${counter}: `, queries);
results = await onQueueSearch();
console.log('Results: ', results);
if(!!queries.length){
return await reRunQueries();
}else{
return results;
}
}
async function onQueueSearch(){
return await longQuery(queries.pop());
}
async function longQuery(param){
if(param === 6){
return param;
}else{
queries.unshift(++param);
return param;
}
}
const RES = reRunQueries();
RES.then(result => {
console.log('RES: ', result);
})
知道递归的停止信号很重要,否则它永远不会结束。
使用Iterable生成器:
const queries = [];
let counter = 0;
const req = { body: { searchTerm: 1 } };
const res = {send: (val) => console.log('RECEIVED: ', val)};
const router = {
post: (route, callback) => callback(req, res)
}
router.post('/', async (req, res) => {
queries.push(req.body.searchTerm);
const results = await queryIterator(queries);
res.send(results);
});
async function* queryGenerator() {
while (true) {
yield await onQueueSearch(queries.pop());
}
}
async function queryIterator(queries) {
for await (const result of queryGenerator()) {
console.log('Iterating... ', result);
console.log(`On Queue Searches #${++counter}: `, queries);
if (!queries.length) {
return result;
}
}
}
async function onQueueSearch(param) {
return await longQuery(param);
}
async function longQuery(param) {
if (param === 6) {
return Promise.resolve(param);
} else {
queries.unshift(++param);
return Promise.resolve(param);
}
}
/*
Iterating... 2
On Queue Searches
Iterating... 3
On Queue Searches
Iterating... 4
On Queue Searches
Iterating... 5
On Queue Searches
Iterating... 6
On Queue Searches
Iterating... 6
On Queue Searches
RECEIVED: 6
*/