在下面的代码中,我使用NodeJS的nano包来使用CouchDB。我正在获取一些记录并在返回数组之前填充该数组。但是相反,该函数返回未定义的值。如何等待foreach首先完成。
这是代码段
function getVoters(){
var voters = new Array();
const db = getConnection();
db.view('typeDesignDoc','voterView',function(err, body){
if(!err){
body.rows.forEach(function(doc){
voters.push(doc);
console.log(voters);
});
return voters;
}
else
console.log(err);
});
}
答案 0 :(得分:1)
您将必须使用回调或promise来完成此操作。
function getVoters(cb) {
var voters = new Array();
const db = getConnection();
db.view('typeDesignDoc', 'voterView', function (err, body) {
if (!err) {
body.rows.forEach(function (doc) {
voters.push(doc);
console.log(voters);
});
cb(null,voters);
}
else
cb(err);
});
}
使用承诺
let Promise = require('bluebird');
function getVoters(cb) {
var voters = new Array();
const db = getConnection();
return new Promise((resolve, reject) => {
db.view('typeDesignDoc', 'voterView', function (err, body) {
if (!err) {
body.rows.forEach(function (doc) {
voters.push(doc);
console.log(voters);
});
return resolve(voters);
}
else
return reject(err);
});
});
}
对长沙发数据库couchdb-promises使用承诺的驱动程序
或使用promisifyAll方法来实现现有驱动程序模块的所有方法。但是,限制功能的传播是有限制的
答案 1 :(得分:0)
您可以使用async-await,前提是db.view
返回一个Promise并重构您的代码,使其看起来像:
const getVoters = async () => {
const db = getConnection();
try {
const body = await db.view('typeDesignDoc','voterView');
const voters = body.rows.map(doc => doc);
return voters;
}
catch (err) {
console.log(err);
}
};
// Call your function later like:
const voters = (async () => {
return await getVoters();
})();