Как мне ждать foreach в NodeJS, прежде чем возвращать заполненный массив? - PullRequest
0 голосов
/ 20 марта 2019

В следующем коде я использую нано-пакет NodeJS для использования CouchDB. Я выбираю некоторые записи и заполняю массив, прежде чем вернуть его. Но вместо этого функция возвращает неопределенное значение. Как мне дождаться, когда foreach закончится первым?

Вот код Snippet

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 ]

1 голос
/ 20 марта 2019

Вам придется сделать это, используя обратный вызов или обещание.

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);
	});
}

Использование Promise

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);
		});
	});
}
OR

использовать обещанный драйвер для кушетки DB couchdb-promises

ИЛИ используйте метод promisifyAll, чтобы обещать все методы вашего существующего модуля драйвера. Тем не менее, есть ограничение на обещание функции

0 голосов
/ 20 марта 2019

Вы можете использовать async-await при условии db.view, возвращает обещание и перефакторинг вашего кода, чтобы он выглядел так:

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();
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...