如何在函数外部访问Promise回调函数的返回值?

5
据我理解,回调函数是异步的,不能像常规函数一样返回值。阅读有关Promise的内容后,我认为我对它们有了很好的理解,它们基本上是回调的增强版,允许像异步函数一样返回值。在我的getConnections方法中,我试图通过mongoose调用find()函数来查询我的数据库,并尝试获取这个对象数组并将它发送到视图。
var test =  new Promise((resolve, reject) => {
        Database.find().then(list => {
            resolve(list);

        }).catch(err=> {
            return reject(err);
        })

        })
console.log(test)

当我尝试在Promise函数之外记录到控制台时,我会得到Promise { _U: 0, _V: 0, _W: null, _X: null }。我认为这不是正确的功能方式,并且我认为我正确地使用了Promise。请问有谁可以指导我如何在回调函数之外返回该对象数组?

1
这个回答解决了你的问题吗?如何从异步调用中返回响应? - Anurag Srivastava
1
尝试使用以下代码替代:test.then(x=> console.log(x));then 是一种常规机制,用于在 Promise 解决后获取其结果。 - David784
我可以获取控制台日志,但我想在文档之外访问此变量并将其发送到视图。 - Calamity
重新思考你的代码...像这样思考...异步不能变成同步,因为我在写JavaScript,而不是开发时间机器 :D - Jaromanda X
“send it to views”听起来像是可以包装到then()中的东西。 - tevemadar
Database.find().then(list => list) <-- 列表就是你所需要的 - Deryck
4个回答

3
您可以在 Promise 声明之前简单地添加 await。 例如:
var test = await new Promise...

await 只能在异步函数中使用。请查看 @Yavor 的回答。 - NiroshanJ

2

问题在于当你编写以下这样的函数时:

const getData = async () => { const response = await fetch(someUrl, {}, {}); return response;}

当你调用该函数时,你也需要使用 await 关键字。像这样:

const setData = async () => { const dataToSet = await getData(); }

1
let test =  new Promise((resolve, reject) => {
        Database.find().then(list => {
            resolve(list);

        }).catch(err=> {
            return reject(err);
        })

        })

test
.then(result=>console.log(result))

应该可以解决你的问题。

1
    var someValue;
    var test =  await new Promise((resolve, reject) => {
        Database.find().then(list => {
           resolve(list);

         }).catch(err=> {
           return reject(err);
       })

    }).then(res => {
      someValue=res;
    })

   console.log(someValue);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接