首页 > 解决方案 > 避免嵌套承诺

问题描述

我正在为以下功能获得“避免嵌套承诺”(用于 jslint)。我怎样才能在没有嵌套承诺的情况下写这个?

function deleteUIDsFromDBForKey(rootkey, users_uids) {
  return retrieveUIDsFromDBForKey(rootkey)
    .then(uids => {
      let diff = uids.diff(users_uids)
      let deletes = []
      diff.forEach(key => {
        deletes.push(firebase.database().ref(rootkey + "/" + key).remove())
      })
      return Promise.all(deletes)
        .then(value => {
          return diff
        })
    })
}

标签: node.jses6-promise

解决方案


最后一个then可以通过返回Promise.all结果向上移动到主链:

function deleteUIDsFromDBForKey(rootkey, users_uids) {
  let diff;
  return retrieveUIDsFromDBForKey(rootkey)
    .then(uids => {
      diff = uids.diff(users_uids)
      let deletes = []
      diff.forEach(key => {
        deletes.push(firebase.database().ref(rootkey + "/" + key).remove())
      })
      return Promise.all(deletes)
    })
    .then(value => {
      return diff
    })
}

请注意,要使其正常工作,diff需要扩大变量的范围,如上所述。或者,您可以添加diff到传递给的参数Promise.all,因此您可以diff作为承诺值访问:

function deleteUIDsFromDBForKey(rootkey, users_uids) {
  return retrieveUIDsFromDBForKey(rootkey)
    .then(uids => {
      let diff = uids.diff(users_uids)
      let deletes = []
      diff.forEach(key => {
        deletes.push(firebase.database().ref(rootkey + "/" + key).remove())
      })
      return Promise.all([diff, ...deletes])
    })
    .then(([diff]) => {
      return diff
    })
}

与您的问题无关,但您可以使用map而不是forEachwith push

  let deletes = diff.map(key => {
    return firebase.database().ref(rootkey + "/" + key).remove()
  })

推荐阅读