我对node.js中的异步调用感到非常痛苦。我明白我必须喜欢它,但实际上我讨厌它,只是因为node.js强迫你使用它,而且没有其他选择。
我尝试在不同的数据库上运行smembers
。所以在这里我想确保我使用所有3个数据库因此我使用_.after
。但是它没有用。
var redisfetcher = function(string, callback1)
{
var retrieved = []
var callback = function(){
callback1(retrieved)
}
var afterAll = _.after(3,callback)
for (var col=0; col<=2; ++col) {
client.select(col, function() {
client.smembers(string, function (err, replies) {
if(!err){
retrieved.push(replies)
}
})
afterAll();
})
}
redisfetcher("offer", function(returnValue) {
console.log(returnValue)
})
如果你能帮助我,我将不胜感激。
如果你能展示如何在同步模式下运行以下代码,我将不胜感激。
答案 0 :(得分:1)
使用async模块。
var async = require('async');
async.mapSeries([0, 1, 2], function (db, done) {
// Here `db` will be `0`, or `1` or `2`, i.e. each element of the array.
// The `done` is an internal callback used by the `async` module
// to track whether a particular element of the array is completed
// to be processed. When you're "done" consuming the `db` element of the
// array, you must call `done` to indicate that `async` can now give you
// yet another element to consume, if there is any left to process.
// When all elements are processed, `async` calls the final function
// passes to it as the last argument. For more information refer to
// very detailed docs of `async` module at
// https://github.com/caolan/async#mapSeries.
async.waterfall([
function (cb) {
client.select(db, cb);
},
function (cb) {
client.smembers(string, cb);
}
], done);
}, function(err, resultArr) {
err && console.trace(err);
// `resultArr` now contains 3 replies.
});
请注意上面的代码调用mapSeries
这是顺序的(不要与同步混淆),而不是map
。我建议在您的情况下为每个数据库使用不同的Redis连接,因为如果并行调用,则由于选择不同的数据库而导致同步调用可能会发生冲突。这可能导致针对同一数据库运行命令而不是预期的不同。如果对同一数据库运行多个命令,则单个连接即可。
对于连接池,请使用node-pool。