【问题标题】:Aync / Await return pending异步/等待返回待处理
【发布时间】:2021-11-01 15:17:42
【问题描述】:

为什么我的 Aync Await 函数返回 Pending Promise ?我已经尝试过.then 声明,但它不起作用,这是我的代码:

  const findData = async () => {
    let query = await userSchema.findOne({ _id: research["uploaderID"] });
    return query;
  };

  research["uploaderInfo"] = findData();

  console.log(findData());

当我尝试控制台记录 findData 时,它只给了我这个:

Promise { <pending> }
Promise { <pending> }

当我尝试检查研究对象时,它是空的,但是当我尝试在 findData() 函数中添加 console.log(query) 时,它给了我预期的结果,这意味着 query 是正确的,这是因为 async / await 的问题。

更新

当我尝试像这样设置我的研究时,我尝试使用 @dai 解决方案添加等待

  const findData = async () => {
    let query = await userSchema.findOne({ _id: research["uploaderID"] });
    return query;
  };

  async () => {
    research["uploaderInfo"] = await findData();
  };

当我尝试这个时,我放在第二个无名 async function 中的任何代码都不起作用,我尝试将 object 设置为随机 string 并且它仍然没有改变

【问题讨论】:

  • 你的findData 函数是一个async 函数,它隐式总是返回一个Promise,这意味着你需要await 它返回的Promise 像这样:research["uploaderInfo"] = await findData();跨度>
  • 是的,同意@Dai,请等待,以便您得到答案。
  • 它告诉我需要将 await 放入异步函数中,是否需要将其放入函数中? @戴
  • @Walls 你运行的是什么版本的 NodeJS?现代版本的 NodeJS AFAIK 应该支持“顶级await”。否则,请参阅:stackoverflow.com/questions/46515764/…
  • 你是什么意思你放在第二个异步函数中的任何代码都不起作用?你在调用那个函数吗?

标签: node.js mongoose promise


【解决方案1】:

阅读:https://stackoverflow.com/a/56590390/159145

简答:运行带有 --harmony-top-level-await 标志的 NodeJS 14.17(或 13.3+ 之后的任何版本),你可以得到这个:

// program.js

const findData = async () => {
    let query = await userSchema.findOne({ _id: research["uploaderID"] });
    return query;
};

research["uploaderInfo"] = await findData();

console.log(research["uploaderInfo"]);

...甚至只是这个(假设您的 researchuserSchema 对象被简单地实例化):

// program.js

research["uploaderInfo"] = await userSchema.findOne({ _id: research["uploaderID"] });

console.log(research["uploaderInfo"]);

没有 NodeJS 标志的更长答案

看起来 NodeJS 14.17 还不支持“顶级await”(如果我错了,请有人纠正我)但这不是一个真正的问题:它只是意味着你需要将所有原始顶级(“根函数”)代码包装在 async 函数中并立即调用它。

就像这样(我将函数命名为entrypoint,不过如果你愿意,你可以使用匿名函数):

// program.js

async function entrypoint() {
    
    const research   = ...
    const userSchema = ...

    const findData = async () => {
        let query = await userSchema.findOne({ _id: research["uploaderID"] });
        return query;
    };
    
    research["uploaderInfo"] = await findData();

    console.log(research["uploaderInfo"]);
}

entrypoint();

注意可以省略和内联findData的函数,直接调用userSchema.findOne

// program.js

async function entrypoint() {

    const research   = ...
    const userSchema = ...    

    research["uploaderInfo"] = await await userSchema.findOne({ _id: research["uploaderID"] });

    console.log(research["uploaderInfo"]);
}

entrypoint();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2021-05-25
    • 2020-12-18
    • 2018-01-02
    相关资源
    最近更新 更多