Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 返回承诺的映射中的数组为空-节点JS_Javascript_Node.js_Es6 Promise - Fatal编程技术网

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是一个断点,它将等待内部的所有承诺完成,然后再继续。它不会影响内部承诺的处理方式。