javascript - 响应发送到浏览器后始终执行代码
问题描述
这是我有一个问题的代码,如果我没有在 asyncCall 函数中设置超时,则在异步代码完成之前发送响应,因此我没有从onlineBooksImages() 函数获取图像,但包括超时下面的代码
setTimeout(() => {
if (onlineBook) {
res.status(200).render("showBooks",
{
result: result,
favourites: favourites,
user: user,
book: onlineBook
});
}
}, 5000);
延迟发送响应因此我得到图像如何编写下面的代码以删除比使用异步代码更快的加载更长的超时
var boos = []
var boos2 = []
var boos3 = []
var foo = {}
var foo2 = {}
var foo3 = {}
const onlineBook= await Books2.findById(req.params.id);
const Ebook = await Ebooks.findById(req.params.id);
function onlineBooksImages() {
return new Promise(resolve => {
setTimeout(() => {
let temporaryVar = []
onlineBook.allimages.forEach(element => {
gfs.files.findOne({ _id: element }, (err, file) => {
if (!file || file.length === 0) {
return res.status(404).json({
err: "No file exist"
});
}
var u = []
u.push(onlineBook._id)
var img = []
img.push(file)
user.push(file)
foo3[u] = temporaryVar;
//console.log(user.length);
});
});
boos3.push(foo3)
resolve(boos3);
}, 100);
});
}
async function asyncCall() {
console.log('calling');
if (onlineBook) {
var result = await onlineBooksImages();
} else if (Ebook) {
var result2 = await someOtherFunction();//notImportant
} else {
return res.status(404).render('error', { user });
}
setTimeout(() => {
if (onlineBook) {
res.status(200).render("showBooks",
{
result: result,
favourites: favourites,
user: user,
book: onlineBook
});
}
}, 5000);
}
解决方案
在答案之前......这里有一些有趣的代码
this code looks wrong on many levels
var u = [];
u.push(onlineBook._id);
// snip
foo3[u] = temporaryVar;
现在,让我们说onlineBook._id
==="abc"
所以u === ['abc']
所以foo3[u]
是一样的foo3[u.toString()]
......这将是foo3['abc']
那么为什么不只是foo3[onlineBook._id] = temporaryVar;
但即使这看起来很奇怪,因为其中的每个属性都foo3
将引用同一个数组
例如,如果图书 id 是 'abc'、'def' 和 'ghi' 那么foo3.abc
,foo3.def
并且foo3.ghi
将是完全相同的空数组!
无论如何,要回答一个问题,尽管我仍然对您的“全局” boos* 和 foo* 变量感到困惑-但让我们解决您遇到的问题:
function async onlineBooksImages() {
let temporaryVar = [];
for (let element of onlineBook.allimages) {
try {
const file = await new Promise((resolve, reject) => {
gfs.files.findOne({_id: element}, (err, file) => {
if (err) {
return reject(err);
}
temporaryVar.push(file);
resolve(file);
})
});
if (!file || file.length === 0) {
return reject();
}
foo3[onlineBook._id] = temporaryVar;
} catch(e) {
// do nothing but catch the error
}
}
if (Object.keys(foo3).length) {
boos3.push(foo3);
return boos3;
} else {
// reject if there were no images in any of allimages
throw({status: 400, err: "No file exist"});
}
}
async function asyncCall() {
console.log('calling');
try {
if (onlineBook) {
var result = await onlineBooksImages();
} else if (Ebook) {
var result2 = await someOtherFunction();//notImportant
} else {
return res.status(404).render('error', { user });
}
if (onlineBook) {
res.status(200).render("showBooks", {
result: result,
favourites: favourites,
user: user,
book: onlineBook
});
}
} catch(e) {
if (e.status && e.err) {
res.status(e.status).json({
err: e.err
});
}
}
}
推荐阅读
- mysql - 每个会计年度计数不同并在查询结果中显示所有日期
- linux - 在 Linux 上使用主机名在两台设备之间进行通信
- java - 当我尝试在 java 中使用 selenium webdriver 登录时出现此浏览器或应用程序可能不安全”错误
- arrays - 接收类型为“[key: string]: SOME_TYPE”并返回类型为“SOME_TYPE[]”的数组的函数的类型
- mongodb - 使用 Spring Data Reactive MonogoDB 在表达式中具有多个表达式和多个字段的 $or 运算符
- javascript - 遍历对象数组并更改对象值
- xcuitest - XCUITest 我使用 isHittable ,但它发生断言失败?我的iphone是ios 12
- java - java - 如何在Java中排序的大型文本文件中找到差异(基于行)而不将它们全部加载到内存中?
- python - 数据框:发现GDP连续两个季度下降以发现衰退开始
- elasticsearch - OrchardCore match_phrase 不返回结果