首页 > 解决方案 > 在返回填充的数组之前,如何在 NodeJS 中等待 foreach?

问题描述

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

}

标签: javascriptnode.jsasynchronous

解决方案


您将不得不使用回调或承诺来做到这一点。

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 方法来 promisify 现有驱动模块的所有方法。但是,对承诺功能有限制


推荐阅读