我使用Promise.all()
并在多个Mongo集合中询问URL。
我意识到缺少某些URL。
在这种情况下,我有一个404页。如何避免这种情况(通常与Annonce集合有关)?我可以将Promise.all
替换为什么?
const express = require('express');
const mongoose = require('mongoose');
const { ensureAuthenticated } = require('../helpers/auth');
const router = express.Router();
require('../models/Car');
const Car = mongoose.model('cars');
require('../models/Caratio');
const Caratio = mongoose.model('caratios');
require('../models/User');
const User = mongoose.model('users');
require('../models/Annonce');
const Annonce = mongoose.model('annonces');
router.get('/app/:cars_getroute', ensureAuthenticated, (req, res) => {
Promise.all([Car.findOne({ cars_getroute: req.params.cars_getroute }),
Caratio.findOne({ cars_getroute: req.params.cars_getroute }),
Annonce.findOne({ cars_getroute: req.params.cars_getroute })])
.then(result => {
let [cars, caratios, annonces] = result;
}
答案 0 :(得分:0)
Promise.all
是全有还是全无。一旦阵列中的所有承诺都解决,它就会解决,或者一旦其中一个拒绝,就立即拒绝。一种替代方法是过滤您的承诺,以便您仅等待已解决的承诺。
Promise.all([p1, p2, p3].map(toResultObject)).then((values) => {
for (let i = 0; i < values.length; ++i)
if (!values[i].success) console.log("ERR: " + values[i].error);
else console.log(values[i].result);
});
请参阅Avoiding-Promise-all-fail-fast-behavior
新答案
router.get('/app/:cars_getroute', ensureAuthenticated, async (req, res) => {
const promises = [
Car.findOne({
cars_getroute: req.params.cars_getroute
}),
Caratio.findOne({
cars_getroute: req.params.cars_getroute
}),
Annonce.findOne({
cars_getroute: req.params.cars_getroute
})
]
let [cars, caratios, annonces] = await Promise.all(promises.map(p => p.catch(e => null)))
})
但是您当然应该检查每个值的可为空性。
答案 1 :(得分:0)
如拉菲所说,sapper.beforeRouteChange((to, from, next) => {
const isAuth = "[some session or token check]";
if (!isAuth) {
next('/login')
}
next()
})
中的一个诺言一旦失败,就会被拒绝。
您可以将Promise.all
替换为Promise.allSettled
,这样被拒绝的承诺不会影响(或停止)其他承诺。
Promise.allSettled()方法返回一个承诺,该承诺在所有给定的承诺均已解决或被拒绝后解决,并带有一个对象数组,每个对象描述每个承诺的结果。
请记住,Promise.all
是相当新的版本,IE或Edge以及其他浏览器的旧版本均不支持。
Compatibility table