承诺内的返回值始终是不确定的

时间:2019-07-11 21:34:31

标签: javascript ecmascript-6 promise return

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

未捕获的TypeError:无法读取未定义的属性'then'

输出清楚地表明结果不是承诺,而只是undefined。感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

您不会从foobar函数本身返回任何内容,而只是返回对.then.catch的调用。

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

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

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

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