我是网络开发的新手,异步性和 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/