首页 > 解决方案 > 承诺中的返回值总是未定义的

问题描述

我有一个进行数据库调用的函数。如果此操作成功,我想返回一个布尔值,但我总是得到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

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

未捕获的类型错误:无法读取未定义的属性“then”

输出清楚地表明结果不是一个承诺,它只是undefined. 我很感激任何帮助。

标签: javascriptecmascript-6promisereturn

解决方案


您没有从函数本身返回任何内容- 只是对andfoobar的调用。.then.catch

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

您还可以更改foobar为 ES6 箭头函数并利用隐式返回:

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

const请注意,如果您使用或定义 ES6 函数之前将无法访问它们let- 所以请确保如果您使用箭头函数,它们都定义在顶部的一个区域中。ES5 函数没有这样的限制,因为它们都位于任何代码运行之前。


推荐阅读