Возвращаемое значение в пределах обещания тогда всегда не определено - PullRequest
1 голос
/ 12 июля 2019

У меня есть функция, которая делает вызов базы данных. Я хочу вернуть логическое значение, если эта операция прошла успешно, но я всегда получаю undefined. Поскольку я прочитал, возвращаемое значение также должно быть обещанием, но если я хочу then/catch «обещание», моя функция возвращает undefined.

const foobar = function(data) {
    db.call(data).then(function(res) {
        console.log(res); // returns the expected data, e.g.["foobar", "foo", "bar"]
        return res.includes("bar");
    }).catch(function(err) {
        // if an error occures, the function should ...
        // ... return a false value as well
        return false;
    });
};

Мой вызов функции выглядит так: foobar({1: 'a'}). Как я могу получить логическое возвращаемое значение правильным способом? Я пробовал это со следующими двумя вариантами:

Сначала я подумал, что возвращаемое значение будет нормальным логическим значением:

const return_value = foorbar({1: 'a'}); // returns undefined

После того, как я прочитал, что возвращаемое значение в функции then также будет обещанием, я попытался then/catch it:

const return_value = foobar({1: 'a'}
).then(function(res) {
    console.log(res); 
}).catch(function(err) {
    console.log(err); 
});

Uncaught TypeError: Невозможно прочитать свойство 'then' из неопределенного

Вывод ясно указывает на то, что результат не обещание, а просто undefined. Я ценю любую помощь.

1 Ответ

4 голосов
/ 12 июля 2019

Вы ничего не возвращаете от самой функции foobar - только вызовы .then и .catch.

return db.call(data).then(...).catch(...);

Вы также можете изменить foobar на функцию стрелки ES6 и воспользоваться неявным возвратом:

const foobar = data => db.call(data).then(...).catch(...);

Обратите внимание, что функции ES6 не будут доступны до их определения, если вы используете const или let - поэтому убедитесь, что если вы используете функции со стрелками, все они определены в одной области вверху , Функции ES5 не имеют такого ограничения, потому что все они расположены перед выполнением любого кода.

...