我发现了许多与使用pg-promise和await / async有关的事情,但没有什么能完全解决我的async问题(node / npm包),特别是async.queue和pg-之间的交互。承诺查询。
我的问题:我需要异步进行几百万次计算(匹配得分),并在postgres数据库中的同一异步过程中提交结果。我的主要流程是一个承诺,首先计算表中两个记录的所有可能的不同组合,并一次将它们分成几千个块。
这千个对的块(即[[0,1],[0,2],...,[0,1000]]是我的第一个索引'内容的数组'被送到一个实例async.queue首先执行匹配分数的计算,然后执行db记录。
让我头疼几个小时的部分是,无论是使用插入语句还是事务,db提交都不起作用。我确实知道我用于数据库部分的功能,因为我已经使用它们编写了手动测试。
我的主要代码如下:
'use strict';
const promise = require('bluebird');
const initOptions = {
promiseLib: promise
};
const pgp = require('pg-promise')(initOptions);
const cn = {connexion parameters...};
const db = pgp(cn);
const async = require('async');
var mainPromise = (db, php, param) => {
return new Promise(resolve => {
//some code computing the chunksArray using param
...
var q = async.queue((chunk, done) => {
var scores = performScoresCalculations(chunk);
//scores is an array containing the 1000 scores for any chunk of a 1000 pairs
performDbCommitting(db, scores);
//commit those scores to the db using pg-promise
done();
}, 10);
q.drain = () => {
resolve(arr);
//admittedly not quite sure about that part, haven't used async.queue much so far
}
q.push(chunksArray);
)}.catch(err => {
console.error(err);
});
};
现在我的分数数组看起来像这样:
[{column1:'value1_0',column2:'value2_0',...,columnN:'valueN_0'},...,{column1:'value1_999',column2:'value2_999',column3:'value3_999'其中有一千条记录。
我的performDbCommitting功能如下:
var performDbCommitting = (db, pgp, scores) => {
console.log('test1');
//displays 'test1', as expected
var query = pgp.helpers.insert(scores, ['column1', 'column2', 'column3'], 'myScoreTable');
console.log(query);
//display the full content of the query, as expected
db.any(query).then(data => {
console.log('test2');
//nothing is displayed
console.log(data);
//nothing is displayed
return;
}).catch(err => {
console.error(err);
});
}
所以这是我的问题:
pg-promise似乎不想在与async.queue一起使用的时候在数据库中一次推送我的1000条记录,这就是我被困住的地方。 我可以毫无困难地想象我的错误,这是我第一次使用async.queue,特别是混合了bluebird有希望和pg-promise。
非常感谢您花时间阅读本文,并在可能的情况下阐明这个问题。
答案 0 :(得分:1)
我在我的一台机器上遇到了同样的问题,但其他机器都没有。 对我有用的是将 pg-promise 从 10.5.0 版更新到 10.5.6 版(通过 npm update pg-promise)。
答案 1 :(得分:0)
你的mainPromise并没有等到performDBCommitting完成:
应该是:
//commit those scores to the db using pg-promise
performDbCommitting(db, scores).then(()=>{done();});
并执行DBCommitting也需要返回承诺:
return db.any(query).then(data => {
console.log('test2');
//nothing is displayed
console.log(data);
//nothing is displayed
return null;
}).catch(err => {
console.error(err);
return null;
});