这是我遇到的问题,如果我没有在 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] = temporVar;
但即使这样看起来也很奇怪,因为 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
});
}
}
}
关于javascript - 代码始终在响应发送到浏览器后执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58906314/