javascript - 如何使链式 firebase 查询异步

标签 javascript firebase asynchronous promise async-await

我是网络开发的新手,异步性和 promise 之类的东西对我来说还不是很清楚,所以这个问题可能看起来有点基础。

基本上我需要获取“类(class)”的详细信息。在类(class)详细信息中是需要从另一个集合中获取的 ID 列表。由于 fire base 不支持 WHERE IN 查询,我将一个一个地遍历值,运行查询并将结果附加到数组中。

我有一个查询来获取“类(class)”的详细信息,另一个查询是通过 id 获取“单词”列表,这两个查询都是从第三个函数顺序调用的,我已经使它们全部同步,否则我会得到word_ids(在 getWordsById 中)未定义的错误(因为它在查询之前的 promise 解决之前没有值(value))。

有没有办法异步执行此操作,这样我就不必链接同步查询?我觉得我缺少对 promise 如何工作的一些理解

async getWordsById(word_ids) {
      var words = []
      var arrayLength = word_ids.length;
      for (var i = 0; i < arrayLength; i++) {
        await this.db.collection('words_2').doc(word_ids[i])
          .get().then(function(snap) {words.push(snap.data())})
      }  
      //console.log("Words In Func: ", words)
      return words
  }

  async getPractice (lessonId) {
      var practice_details;
      await this.db.collection('practice').doc(lessonId)
       .get().then(snap => {practice_details = snap.data(); return practice_details;})
       //console.log("Out: ", practice_details)
      return practice_details;

  }

  async getThem (lessonId) {
      var lesson_info = await this.getPractice(lessonId)
      //console.log("Lesson info:", lesson_info.words_id.split(","))
      var word_info = this.getWordsById(lesson_info.words_id.split(","))
      //console.log("words ", word_info)
      return word_info;
  }

最佳答案

我将尝试用简单的代码块来解释这个概念:

const func1 = (num, ms) => new Promise((res, rej) => {
    console.log(`func1 for ${num}`);
    setTimeout(() => { res(`func1 for ${num}`) }, ms);
});

const func2 = (resp, num, ms) => new Promise((res, rej) => {
    console.log(`func2 for ${num}`);
    setTimeout(() => { res(`${resp} func2 for ${num}`) }, ms);
});

async function x() {
    await Promise.all([1, 2, 3, 4].map(async (num) => {
        let resp1 = await func1(num, 5000);
        let resp2 = await func2(resp1, num, 5000);
        console.log(resp2);
    }));
    console.log('Done!!');
}
x();

函数 x() 是主要函数,它遍历数字数组,异步调用 func1。 一旦 func1 解析,使用 func1 的响应调用 func2,然后它会花费自己的甜蜜时间来解析。 希望对您有所帮助。

--- 可能的代码解决方案(当然无法测试)---

async function getWordsById(word_ids) {
    var words = [];
    await Promise.all(word_ids.map(async word_id => {
        return new Promise((resolve, reject) => {
            let resp = this.db.collection('words_2').doc(word_id).get();
            words.push(resp.data());
            resolve('');
        });
    }));
    return words;
}

async function getPractice (lessonId) {
    return new Promise((resolve, reject) => {
        let resp = this.db.collection('practice').doc(lessonId).get();
        resolve(resp.data());
    });
}

async function getThem (lessonId) {
    var lesson_info = await this.getPractice(lessonId)
    var word_info = await this.getWordsById(lesson_info.words_id.split(","))
    return word_info;
}

关于javascript - 如何使链式 firebase 查询异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55409572/

相关文章:

Firebase 确认电子邮件未发送

c# - 使用 ASP.NET MVC 4 和 Angularjs 的异步 Web 应用程序

javascript - d3.js 规模/域值的意外行为

javascript - 如何设置 MongoClient 连接超时?

javascript - 在 react 中,我如何做一个 if 语句

python - `create_task()`处的任务是什么时候asyncio执行的?

c# - 如何从 List.ForEach C# 进行异步调用

javascript - AJAX 调用和更新查询无法正常运行

android - 从 firebase 数据库 android 检索数据

Swift 4 和 Firebase 附加所有带有用户名和个人资料图像错误的帖子