节点js等待循环完成
Node js wait for loop to finish
我正在尝试 return 某个用户喜欢的事件列表,但是代码 return 数组似乎总是空的(return 在我的之前执行for循环)。
router.route("/app/mylikes").get(async function(req, res, next) {
var mylikes = [];
const likes = await Like.find();
likes.forEach(element => {
bcrypt.compare(req.user.device_uuid, element.device_uuid, function(
err,
isMatch
) {
if (isMatch) {
mylikes.push(element.event_id);
}
});
});
res.send(mylikes);
});
用户的 uuid 在 table 中进行了哈希处理,所以我先使用 bcrypt 进行比较,然后将其添加到我的 "mylikes" 数组中。
在 Promises/await/async 方面,我仍然是个菜鸟,因此非常感谢您的帮助。
您正在使用 bcrypt.compare
的回调系统,但是当您省略回调参数时,还有一个 promise interface for it:
for (let element of likes) {
let isMatch = await bcrypt.compare(req.user.device_uuid, element.device_uuid);
if (isMatch) {
mylikes.push(element.event_id);
}
}
确保使用 is compatible with your version of Node.
的 bcrypt 版本
如果由于某种原因你不能移动到 bcrypt 3(我会问 "why?"),那么你可以按如下方式承诺 compare
方法的非承诺版本:
let comparePromise = (str, hash) =>
new Promise((resolve, reject) =>
bcrypt.compare(str, hash, (err, isMatch) =>
err ? reject(err) : resolve(isMatch)
)
);
然后:
for (let element of likes) {
let isMatch = await comparePromise(req.user.device_uuid, element.device_uuid);
if (isMatch) {
mylikes.push(element.event_id);
}
}
请注意,您不能在其回调中使用 .forEach
和 await
,因为那样不会停止 forEach
迭代挂起。这就是我使用 for...of
循环的原因。
我正在尝试 return 某个用户喜欢的事件列表,但是代码 return 数组似乎总是空的(return 在我的之前执行for循环)。
router.route("/app/mylikes").get(async function(req, res, next) {
var mylikes = [];
const likes = await Like.find();
likes.forEach(element => {
bcrypt.compare(req.user.device_uuid, element.device_uuid, function(
err,
isMatch
) {
if (isMatch) {
mylikes.push(element.event_id);
}
});
});
res.send(mylikes);
});
用户的 uuid 在 table 中进行了哈希处理,所以我先使用 bcrypt 进行比较,然后将其添加到我的 "mylikes" 数组中。
在 Promises/await/async 方面,我仍然是个菜鸟,因此非常感谢您的帮助。
您正在使用 bcrypt.compare
的回调系统,但是当您省略回调参数时,还有一个 promise interface for it:
for (let element of likes) {
let isMatch = await bcrypt.compare(req.user.device_uuid, element.device_uuid);
if (isMatch) {
mylikes.push(element.event_id);
}
}
确保使用 is compatible with your version of Node.
的 bcrypt 版本如果由于某种原因你不能移动到 bcrypt 3(我会问 "why?"),那么你可以按如下方式承诺 compare
方法的非承诺版本:
let comparePromise = (str, hash) =>
new Promise((resolve, reject) =>
bcrypt.compare(str, hash, (err, isMatch) =>
err ? reject(err) : resolve(isMatch)
)
);
然后:
for (let element of likes) {
let isMatch = await comparePromise(req.user.device_uuid, element.device_uuid);
if (isMatch) {
mylikes.push(element.event_id);
}
}
请注意,您不能在其回调中使用 .forEach
和 await
,因为那样不会停止 forEach
迭代挂起。这就是我使用 for...of
循环的原因。