我如何在返回填充数组之前在NodeJS中等待foreach?

时间:2019-03-20 07:02:38

标签: javascript node.js asynchronous

在下面的代码中,我使用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);
});

}

2 个答案:

答案 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();
})();