node.js - 避免嵌套承诺
问题描述
我正在为以下功能获得“避免嵌套承诺”(用于 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
})
})
}
解决方案
最后一个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
而不是forEach
with push
:
let deletes = diff.map(key => {
return firebase.database().ref(rootkey + "/" + key).remove()
})
推荐阅读
- visual-studio - 未能创建组件“BindingNavigator”
- c - 递归:从袋子中挑选 8 个球。问题:如何避免相同的答案?
- c - 如果在分叉时复制了指针的地址,那么指针指向的值如何对每个子进程都是唯一的?
- intellij-idea - IntelliJ“问题”视图仅显示很少的错误
- python - 没有引用和赋值的递归
- javascript - 在 Qualtrics 循环和合并中存储音频重播计数
- reactjs - Zlib.Gunzip 在 Grafana 插件中不起作用
- c++ - 库存系统中的对象切片
- ios - 使用 AppCode 时,无法通过 CocoaPods 使用第三方库
- python-3.x - 无法在 Python-3.7-alpine docker 容器上安装 gcc