Javascript 返回承诺的映射中的数组为空-节点JS
我是这方面的新手。 我的问题是,当我试图返回一个充满值的数组时,它返回的是空的。 几周前我遇到了这个问题,我解决了它,将映射声明为一个Javascript 返回承诺的映射中的数组为空-节点JS,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我是这方面的新手。 我的问题是,当我试图返回一个充满值的数组时,它返回的是空的。 几周前我遇到了这个问题,我解决了它,将映射声明为一个常量,并在函数中返回它的值。。。但我记不得我是怎么做的了 这是我的代码: module.exports.deleteLockedEmail = (req, res, next) => { const maxDateAd = new Date().getTime() - 2592000000; const adIdsToDelete = []; A
常量
,并在函数中返回它的值。。。但我记不得我是怎么做的了
这是我的代码:
module.exports.deleteLockedEmail = (req, res, next) => {
const maxDateAd = new Date().getTime() - 2592000000;
const adIdsToDelete = [];
Admin.find({})
.then(emailLocked => {
const mapToLockedEm = emailLocked.map(element => {
return User.findOne({email:element.email})
.then(userLocked => {
return adIdsToDelete.push(userLocked)
})
.catch(error => console.log(error))
})
return mapToLockedEm
})
.catch(error => console.log(error))
cron.schedule("* * * * *", function() {
console.log("running a task every minute => delete locked ads");
});
}
如何填充此数组
adIdsToDelete = [];
请记住,所有这些对数据库的调用都是异步的。要获得这些值,您必须等待承诺得到解决并返回值。在这种情况下,我们可以使用Promise.all等待所有承诺执行,然后在下一个
上下文中执行
module.exports.deleteLockedEmail = (req, res, next) => {
const maxDateAd = new Date().getTime() - 2592000000;
const adIdsToDelete = [];
Admin.find({})
.then(emailLocked => {
const mapToLockedEm = emailLocked.map(element => {
return User.findOne({email:element.email})
.then(userLocked => {
return adIdsToDelete.push(userLocked)
})
.catch(error => console.log(error))
})
return Promise.all(mapToLockedEm)
}).then(() => {
// In this context the adIdsToDelete will be filled
});
.catch(error => console.log(error))
cron.schedule("* * * * *", function() {
console.log("running a task every minute => delete locked ads");
});
}
另外,一般来说,处理像adIdsToDelete
这样的变量可能有点棘手,因为它们与承诺链的作用域不同。正如在您的示例中所发生的那样,当这个变量实际充满值时,可能会令人困惑
您可以按如下方式重写它
module.exports.deleteLockedEmail = (req, res, next) => {
const maxDateAd = new Date().getTime() - 2592000000;
Admin.find({})
.then(emailLocked => {
const mapToLockedEm = emailLocked.map(element => {
return User.findOne({email:element.email})
.catch(error => console.log(error))
})
return Promise.all(mapToLockedEm)
}).then(adIdsToDelete => {
// In this context the adIdsToDelete will be filled
});
.catch(error => console.log(error))
cron.schedule("* * * * *", function() {
console.log("running a task every minute => delete locked ads");
});
}
使用Promise.all
我觉得@AbdullahAbid也可以做得更干净一点,我也会尝试,这是一个很好的观点。你应该避免推送ing,尽管Promise.all
Promise已经解析为一个all数组results@libik你完全正确!我非常感激你的回答。在我开始阅读更多关于promise all的文章之前,我有几个问题。1.我需要再写一封吗?明白吗?2.我在发布我的问题promise.all之前尝试过,但是创建了新的varaible testPromise=,但没有成功。承诺。一切都不需要承诺,只是在一个变量里有一个承诺?再次感谢你!谢谢大家。@Bergi,没用,你能说得更具体些吗?谢谢@titoih-在承诺链的末尾只有一个catch
就足够了,那么在承诺链中抛出的任何错误都将冒泡到该catch
。只有当您不想在发生错误时破坏整个承诺链时,才应使用其他捕获(像现在一样,当User.findOne
由于任何原因以错误结束时,它将被内部捕获,承诺链将继续,因为什么也没有发生。如果这是您想要的,请保留它。如果您希望在出现意外错误时中止任何处理,则应删除内部捕获catch@titoih-不知道你在舞会上是什么意思假设Promise.all是一个断点,它将等待内部的所有承诺完成,然后再继续。它不会影响内部承诺的处理方式。