【问题标题】:My function is returning a Promise and I never told the function to return a Promise我的函数正在返回一个 Promise,但我从未告诉该函数返回一个 Promise
【发布时间】:2020-10-04 08:02:53
【问题描述】:

我正在为我的数据库制作一个模块,但我不知道为什么我的函数返回一个 Promise,代码如下:

async function GetGuildData(guildID) {
    if(await guildDataModel.exists({ guildID: guildID })) {
        guildDataModel.findOne({ guildID: guildID }).then(document => {
            return document;
        }).catch(error => console.error("[ERROR] An error ocurred while I was trying to get guild data:\n\n".red, error));
    } else {
        return console.error("[ERROR] The guild doesn't exist".red)
    };
};

请帮忙,我不知道为什么会这样:

  • MongoDB - 猫鼬

【问题讨论】:

  • 它应该返回document,在该行中:return document;
  • 您将函数定义为异步函数。异步函数总是返回一个承诺。

标签: javascript database mongodb mongoose discord.js


【解决方案1】:

就像每个人都说异步函数总是返回承诺,

这也行不通:

.then(document => {
    return document;
});

它基本上什么都不做。您需要在 if 语句中返回承诺,如下所示:

if(await guildDataModel.exists({ guildID: guildID })) {
    return guildDataModel.findOne({ guildID: guildID });
}

然后在其他部分

const data = await GetGuildData(guildID).catch(err => {});

【讨论】:

  • 请注意,顶级 await 处于阶段 3 (tc39.es/proposal-top-level-await),在 V8 中实现。不是所有的浏览器,行为都是有保证的。
  • 我知道,我没有使用顶级等待,我只是展示了他在异步函数内部的 if 语句块。至于const data = ...,我认为 OP 会知道这一点。
【解决方案2】:

这是 ES6 带来的隐含陷阱之一。查看 MDN 文档: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

异步函数返回Promise

如果您返回的内容还不是一个承诺,它会用Promise 包裹起来:

Promise.resolve(whatever)

如果你不想使用 then,你可以这样做:

 !async function(){

     //define GetGuildData
     let data = await GetGuildData(whatever);
     //do something with data

    }();

【讨论】:

  • 如何使函数返回document
  • 在另一个异步函数中调用此函数并使用 await。或者习惯使用“then”。
  • 我没理解正确...你的意思是把函数中的async去掉,在调用函数的时候加上async
  • @Sandessat 因为你的函数依赖于其他承诺,如果它有用的话,你的函数也需要返回一个承诺。你无法解决这个问题。
  • @Sandessat,检查我的答案,你有一些学习要做..
猜你喜欢
  • 2021-08-04
  • 2017-09-13
  • 2013-11-25
  • 2021-10-18
  • 2020-06-20
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2020-07-09
相关资源
最近更新 更多