【发布时间】:2017-05-19 03:00:05
【问题描述】:
我有一个同步遍历数组的方法,然后将数据结构返回给调用者。从逻辑上讲,该函数执行以下操作:
const myFunction = (inputarray) => {
let returnarray = [];
for (let element of inputarray){
let returnelement = {
a: element.A,
b: element.B
}
if (returnelement.b == 5){
returnelement.c = a + b;
}
returnarray.push(returnelement);
}
return returnarray;
}
到目前为止一切顺利。但是,我意识到要填充returnelement.c 的属性,我需要从我的数据库中获取一些东西。我正在使用带有 mongoose 的 MongoDB 数据库。所以我将使用element.a 来获取我放入c 的内容。这意味着我需要进行异步调用来获取这些数据。
const myFunction = (inputarray) => {
let returnarray = [];
for (let element of inputarray){
let returnelement = {
a: element.A,
b: element.B
}
if (returnelement.b == 5){
MyType.find({ key: returnelement.b }, (err, value) => {
returnelement.c = value;
});
}
returnarray.push(returnelement);
}
return returnarray;
}
这显然行不通。我的函数不会等待异步调用完成,它会在完成遍历数组后返回。
我想让函数在从数据库中获取所有值时将完成的结构返回给调用者。我想这意味着我需要将我的方法也重构为异步的,并在完成后调用回调,但我看不到一个干净的方法来做到这一点。我不能在 mongooses 回调中调用回调,因为我不能确定回调是最后一个完成的回调。我什至不知道 for 循环中有多少次迭代甚至会进行数据库调用。 (returnelement.b == 5)。
一个想法是做一个变量,以数组的长度开始,每次解析的回调减1,如果returnelement.b != 5减1,当回调中该值达到0时,我们调用回调对于我们的函数并传递returnarray。我希望有一个更好,更干净的版本吗?
【问题讨论】:
-
您可以考虑将整个事情移到异步回调或 Promise 中。
标签: javascript asynchronous mongoose callback