javascript - 在函数完成之前,无法使用“等待”使代码等待
问题描述
我正在调用一个本地函数,它必须等待该本地函数的结果才能进一步继续。
这是我的本地功能
var Messagehome = (req, res) => {
user.find().exec(async (err, user) => {
if (err) return res.json(err);
let p = await getfulluser(req.User._id);
list = user.filter((u) => u._id != req.User._id);
console.time("time1");
for (let i = 0; i < p.messages.length; i++) {
for (let e = 0; e < list.length; e++) {
if (list[e]._id.equals(p.messages[i]._id)) {
list.splice(e, 1);
break;
} else {
console.log(list[e].name);
list[e].password = undefined;
}
}
}
console.timeEnd("time1");
return res.json(list), list;
});
};
exports.Messagehome = Messagehome;
我想在这个函数中使用 Messagehome。它必须等待 Messagehome 继续“for循环”。我试过等待,但它没有用
exports.refreshfind = async (req, res) => {
let { id } = req.body;
if (list) {
console.time("TIME 1");
for (let e = 0; e < list.length; e++) {
if (list[e]._id.equals(id)) {
list.splice(e, 1);
res.json(list);
console.timeEnd("TIME 1");
break;
}
}
}
if (!list) {
console.time("TIME 2");
Messagehome();
for (let e = 0; e < list.length; e++) {
if (list[e]._id.equals(id)) {
list.splice(e, 1);
res.json(list);
console.timeEnd("TIME 2");
break;
}
}
}
};
我收到此错误
(node:13396) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'length' of undefined
at exports.refreshfind (D:\message\backend\controllers\message.js:58:30)
at Layer.handle [as handle_request] (D:\message\backend\node_modules\express\lib\router\layer.js:95:5)
at next (D:\message\backend\node_modules\express\lib\router\route.js:137:13)
at D:\message\backend\controllers\user.js:94:5
at D:\message\backend\node_modules\jsonwebtoken\verify.js:223:12
at getSecret (D:\message\backend\node_modules\jsonwebtoken\verify.js:90:14)
at Object.module.exports [as verify] (D:\message\backend\node_modules\jsonwebtoken\verify.js:94:10)
at exports.isSignedIn (D:\message\backend\controllers\user.js:89:7)
at Layer.handle [as handle_request] (D:\message\backend\node_modules\express\lib\router\layer.js:95:5)
at next (D:\message\backend\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (D:\message\backend\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (D:\message\backend\node_modules\express\lib\router\layer.js:95:5)
at D:\message\backend\node_modules\express\lib\router\index.js:281:22
at Function.process_params (D:\message\backend\node_modules\express\lib\router\index.js:335:12)
at next (D:\message\backend\node_modules\express\lib\router\index.js:275:10)
at Function.handle (D:\message\backend\node_modules\express\lib\router\index.js:174:3)
(node:13396) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:13396) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
(node:13396) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'User' of undefined
at D:\message\backend\controllers\message.js:14:35
at D:\message\backend\node_modules\mongoose\lib\model.js:4599:16
at D:\message\backend\node_modules\mongoose\lib\utils.js:264:16
at D:\message\backend\node_modules\mongoose\lib\query.js:4326:11
at D:\message\backend\node_modules\kareem\index.js:135:16
at processTicksAndRejections (internal/process/task_queues.js:79:11)
(node:13396) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
它无法从refreshfind 中的if(!list) 中读取“长度”。
我尝试了等待 Messagehome 和 for 循环,但它没有用
if (!list) {
console.time("TIME 2");
Messagehome();
for (let e = 0; e < list.length; e++) {
if (list[e]._id.equals(id)) {
list.splice(e, 1);
res.json(list);
console.timeEnd("TIME 2");
break;
}
}
}
};
解决方案
我从实时聊天室得到了一些解决方案。由于 Messagehome(req,res) 是用 req, res 定义的,所以我必须以与
Messagehome(req,res)
这是行不通的
Messagehome()
我通过研究 promise 找到了剩下的解决方案。Messagehome 必须是一个基于 promise 的函数,以便在调用时等待。这是完整的解决方案
var Messagehome = (req, res) => new Promise((resolve, reject) => {
user.find().exec(async (err, user) => {
if (err) return res.json(err);
let p = await getfulluser(req.User._id);
list = user.filter((u) => u._id != req.User._id);
console.time("time1");
for (let i = 0; i < p.messages.length; i++) {
for (let e = 0; e < list.length; e++) {
if (list[e]._id.equals(p.messages[i]._id)) {
list.splice(e, 1);
break;
} else {
console.log(list[e].name);
list[e].password = undefined;
}
}
}
console.timeEnd("time1");
res.json(list);
resolve (list)
});
})
exports.Messagehome = Messagehome;
由于 Messagehome 是基于 Promise 的函数,它会等到该 Promise 完成。所以我可以在 refreshfind 中从 Messagehome 获取列表
exports.refreshfind = async (req, res) => {
let { id } = req.body;
if (list) {
console.time("TIME 1");
for (let e = 0; e < list.length; e++) {
if (list[e]._id.equals(id)) {
list.splice(e, 1);
res.json(list);
console.timeEnd("TIME 1");
break;
}
}
}
if (!list) {
console.time("TIME 2");
await Messagehome(req,res);
for (let e = 0; e < list.length; e++) {
if (list[e]._id.equals(id)) {
list.splice(e, 1);
res.json(list);
console.timeEnd("TIME 2");
break;
}
}
}
};
现在等待真的会等我
推荐阅读
- python - 使用来自同一表的计算数据更新 PostgresSQL 列
- javascript - 在表单提交上创建一个段落
- javascript - Uncaught SyntaxError: Unexpected token '<' for doctype 当我向 Vue 添加外部 js 文件时
- spring - Log4j 日志文件未在指定位置 springboot 创建
- excel - 带有 TODAY() 和其他日期的 AVERAGEIF/AVERAGEIFS
- java - 如何弹出、查看和获取尺寸?
- wordpress - ACF 渲染块使 wp 中的编辑页面不读取任何 CSS
- yellowbrick - 如何更改黄砖地块中的标记?
- artificial-intelligence - 如何使用 4x4 tic tac toe 的 minimax 算法使 AI 更有效?
- tomcat - 为什么有些 HTTP/HTTPS 随机以 1|X 开头?