【问题标题】:Imbricated promises错综复杂的承诺
【发布时间】:2016-01-13 16:34:00
【问题描述】:

我想做的事:获取项目列表(来自 API),请求每个项目的状态。并调用一个代表我项目的全局状态的回调。

我是如何做到的:第一个promise得到所有项目,然后在第一个然后 我正在尝试为每个项目调用一个 getProjectStatus 来获取状态。我希望我的第二个 then 等待我完成迭代(我尝试了许多不同的事情,但我的第二个 then 总是在之前被调用)。我不知道这是否是一个很好的使用承诺......

  var that = this;
  var options = { url : this.host + "projects", json : true }

  var finalStatus = "SUCCESS";

  // first promises
  return request(this.options)
  .then(function(projects) { 
    projects.forEach(function(element, index, array) {
        // second promises
        that.getProjectStatus(element.id, function(status){})
        .then(function(status) {
            if(status != "SUCCESS)
            {
                finalStatus = "FAILURE";
            }
        });
    })
  })
  .then(function(){
      callback(finalStatus)});

【问题讨论】:

  • 我认为这个问题有很多版本,但这是我能找到的第一个。在任何情况下,这在文档中都作为示例涵盖了几乎每个 Promise 实现。
  • 嘿Mathletics,我知道Promise.all,但我无法正确使用它,我没有找到在我的叠放中使用它的方法(正如我所说我试图实现然后在第二个中)。谢谢

标签: javascript node.js promise httprequest


【解决方案1】:

这应该会让你继续前进。您只需在第二个承诺数组上使用Promise.all。我可能不明白getProjectStatus 的确切语法,但你可以调整我希望如果需要的话

  return request(this.options)
  .then(function(projects) {
    return Promise.all( projects.map(element => that.getProjectStatus(element.id) )

  .then(function(){
      callback(finalStatus)});

【讨论】:

  • 哦,太棒了,我第二次尝试使用 Promise.all(在数组中添加承诺并返回它),但没有运气。
猜你喜欢
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多