如何在节点中的knex db中生成同步方式。 http://knexjs.org/#Promises-then
knex.select('*').from('users').where({name: 'Tim'})
.then(function(id) {
console.log('Inserted Account ' + id);
})
我想要这样的东西
knex.select('*').from('users').where({name: 'Tim'})
.sync().then(function(id) {
console.log('Inserted Account ' + id);
}); // code should not continue to run until completing then function
或
如何使异步lib运行多个并行任务并以同步代码返回结果。像下面或类似的东西
var results=async.sync().parallel([
task1,task2
],function(err, res){
results=res;
}); // anything like var results or sync()
console.log(results);
答案 0 :(得分:0)
我会质疑你需要在"同步模式"中运行。您可以建立一些流量控制,最糟糕的是,您可能会严重影响NodeJS服务器。由于NodeJS的单线程架构,您的建议是让所有其他事件/用户等到当前操作调用DB并返回。这不是NodeJS的好用。
从我的问题可以看出,像async.parallel
这样的东西对你有用。
async.parallel({
queryone: function( parCb ){
var query = knex('users').select().where( 'name', 'Tim' );
query.exec( function(err, results ) {
parCb( err, results );
} );
},
querytwo: function( parCb ){
var query = knex('otherTable').select().where( 'name', 'Tim' );
query.exec( function(err, results ) {
parCb( err, results );
} );
},
},
function(err, results) {
//Results are all ready, containing the results of two different queries
console.log( 'Results for queryone: ' + JSON.stringify( results.queryone ) );
console.log( 'Results for querytwo: ' + JSON.stringify( results.querytwo ) );
});
此处,当您到达function(err,results)
回调时,results
会填充两个查询中的数据,并行执行。所有这些都没有完全阻止你的其他事件。
答案 1 :(得分:0)
你可以这样做:
async getOne(table, { fields = '*', filters = {} }) {
const promise = new Promise(async (resolve, reject) => {
knex(table).where(filters).select(fields).first().then((result) => {
resolve(result);
}).catch((err) => resolve({}));
});
return await promise;
}
然后
let data = (await getOne('demo', {})).map(d => return d);
现在数据变量是一个数组。