Promise.All with Object Mapping - 未定义

时间:2018-04-22 12:41:02

标签: javascript promise

这次我创建了一个像这样的Promise.all Call。 tools.isMember tools.unsubscribe 将返回承诺对象。

   tools.isMember(userid)
      .then(results => {

          Promise.all(
            Object.keys(results).map((key, index) => {
              tools.unsubscribe(results[index], userid)
            })
          )

      })
      .then(unsubscribe => { console.log('Unsubscribed Results => ', unsubscribed)})
      .catch(err => console.log(err))

控制台打印

  

未订阅结果=>未定义

我尝试将日志记录稍微调试一下,然后将console.log放在 tools.unsubscribe

的位置
   tools.isMember(userid)
      .then(results => {

          Promise.all(
            Object.keys(results).map((key, index) => {
              tools.unsubscribe(results[index], userid).then(result => { console.log('Result from Tools => " result) }) //Added Logging Here
            })
          )

      })
      .then(unsubscribe => { console.log('Unsubscribed Results => ', unsubscribe)})
      .catch(err => console.log(err))

现在控制台显示

  

未订阅结果=>未定义

     

来自Tools =>的结果1

所以现在我知道承诺是从tools.unsubscribed返回预期的结果,然而Promise.all应该返回一个包含所有结果的数组?它现在显示未定义。

我尝试过很多不同的故障,但我是Promise的新手。试着弄清楚Promise.all这次出了什么问题。

更新@Bergie:添加了对tools.unsubscribe的回复

   tools.isMember(userid)
      .then(results => {

          Promise.all(
            Object.keys(results).map((key, index) => {
              tools.unsubscribe(results[index], userid).then(result =>  { return result })
            })
          ).then(result => { return result }) //Tryning to interpret Bergie's answer            
      })
      .then(unsubscribe => { console.log('Unsubscribed Results => ', unsubscribed)})
      .catch(err => console.log(err))

控制台打印

  

未订阅结果=>未定义

1 个答案:

答案 0 :(得分:1)

你需要从你的地图返回一个承诺,目前你还没有返回任何东西,相当于未定义的箭头函数,在主体块周围需要显式返回花括号,所以你要么添加它,要么删除它花括号。

你也不需要地图中的then,你需要返回unsubscribe()调用的结果,这是一个Promise本身。

所以你的代码应该是:

tools.isMember(userid)
        .then(results => {
            Promise.all(
                Object.keys(results).map((key, index) => tools.unsubscribe(results[index], userid))
            ).then(unsubscribe => { console.log('Unsubscribed Results => ', unsubscribed)}) //unsubscribe is an array
            .catch(err => console.log(err))
        })

编辑:

then()是Promise对象的一个​​方法,所以你应该在Promise的实例上调用它。有关详细信息,请参阅the MDN documentation page

我的意思是将返回放在箭头函数体中或删除花括号{和}是

(x, y) => x + y 
//is equivalent to 
(x, y) => {
   return x + y
}
//while
(x, y) => {
    x + y
}
//is equivalent to
(x, y) => {
    x + y
    return
}