У вас 2 проблемы.
1. Невозможно переназначить переменную, переданную в качестве параметра внутри функции:
var a = 1;
function fn(b) {
b = 2;
}
fn(a);
a === 1; // true
Кроме того, это плохой шаблон для изменения данных внутри функций, когда это не нужно. Лучше просто вернуть и назначить во внешней области видимости:
function all() {
return card.cards.find({});
}
all(a).then(console.log); // [...]
Но вы можете изменить массив без переназначения:
var a = [1, 2, 3];
function fn(array) {
array.splice(0, Infinity, ...[5, 6, 7, 8]);
}
a; // [1, 2, 3]
fn(a);
a; // [5, 6, 7, 8]
2. Asyn c вызывает Mon goose и asyn c -aaait / promises
Тем не менее, даже если вы возвращаете это из функции all
, вам придется ждать результата.
Calls в понедельник goose методы asyn c. Это означает, что они возвращают объекты Promise (или обещания), которые реализуют интерфейс с методами then
и catch
. Функция, переданная методу then
, будет вызвана, если обещание будет успешно разрешено, а функция в catch
будет вызвана, если обещание будет отклонено.
Например,
function p() {
if (Math.random() > 0.5) {
return Promise.resolve(1);
} else {
return Promise.reject(new Error('2'));
}
}
p()
.then(function (result) { /* will be called half of time for resolve branch */ })
.catch(function (error) { /* will be called for reject branch */ })
Этот код похож на, но использует syntacti c sugar:
async function p() {
if (Math.random() > 0.5) return 1; // Similar to return Promise.resolve(1);
throw new Error('2'); // Similar to return Promise.reject(new Error('2'))
}
Для ожидания обещаний внутри функции asyn c есть ключевое слово await
.
async function all() {
try {
return await cards.find({});
} catch(error) {
if (false /* somehow handle mongoose errors */) {
// check error, if db not ready just retry or do sth else
// …
}
// Just rethrow if we can't do any
throw error;
}
}
Подробнее об asyn c -wait: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function