Node.js 使用 Promise.all 返回异步调用?

雷姆·哈利勒

目前,我正在使用云函数来查询帖子。当查询帖子时,我在查询帖子的一些其他更新后为 firebase 设置了一些更新,如下所示:

 const getPostsForDate = admin.firestore().collection('posts').where('timeOfDeletion', '<', currentTime)
return getPostsForDate.get().then(snapshot => {
    const updates = {} 
    var counter = 0
    const batch = admin.firestore().batch()
    snapshot.forEach((doc) => {

        var key = doc.id
        admin.database().ref('/convoID/' + key).once('value', (snapshot) => {
            if (snapshot.exists()) {
                const convoIDCollection = snapshot.val()
                for (var child in convoIDCollection) {

                    console.log(child)
                    updates["conversations/" + child] = null
                    updates["messages/"+ child] = null
                    updates["convoID/"+ child] = null
                }
            }
            updates["/convoID/" + key] = null
            updates["/reveals/" + key] = null
            updates["/postDetails/" + key] = null
            const postFireStoreRef = admin.firestore().collection('posts').doc(key)
            const posterRef = admin.firestore().collection('posters').doc(key)
            batch.delete(postFireStoreRef)
            batch.delete(posterRef)
            counter++
         })

    })
    if (counter > 0) {
        console.log("at the deletion")
          return Promise.all[admin.database().ref().update(updates), batch.commit()] 
    }
    else {
        console.log("null")
        return null
    }
})

})

然而,问题是查询 admin.database().ref('convoID/...) 是异步的;因此,更新发送到数据库为空,没有任何变化。现在,解决这个问题的方法是承诺,除了实现 promise.all 和所有其他回报并没有按预期进行。我试过了

 var promises = []
    snapshot.forEach((doc) => {

        var key = doc.id
        promises.push(admin.database().ref('/convoID/' + key).once('value', (snapshot) => {
            if (snapshot.exists()) {
                const convoIDCollection = snapshot.val()
                for (var child in convoIDCollection) {

                    console.log(child)
                    updates["conversations/" + child] = null
                    updates["messages/"+ child] = null
                    updates["convoID/"+ child] = null
                }
            }
            updates["/convoID/" + key] = null
            updates["/reveals/" + key] = null
            updates["/postDetails/" + key] = null
            const postFireStoreRef = admin.firestore().collection('posts').doc(key)
            const posterRef = admin.firestore().collection('posters').doc(key)
            batch.delete(postFireStoreRef)
            batch.delete(posterRef)
            counter++
         })
        )
    })
promises.all(promises).then(() =>
     if (counter > 0) {
        console.log("at the deletion")
          return Promise.all[admin.database().ref().update(updates), batch.commit()] 
    }
    else {
        console.log("null")
        return null
    }
);

除了我收到错误unexpected token ifDeclaration or statement expected最后由 promises.all() 这是等待异步调用完成的正确方法吗?

jfriend00

为了结束这个问题,我将尝试总结我们在评论中涵盖的内容:

修复箭头函数定义。改变这个:

promises.all(promises).then(() => code here)

对此:

Promise.all(promises).then(() => { code here });

并且,修复 Promise.all() 的调用。改变这个:

return Promise.all[...] 

对此:

return Promise.all([...])

并且,admin.database().ref().once()将返回一个承诺,但前提是您不通过.once()常规回调。

所以,改变这个:

promises.push(admin.database().ref('/convoID/' + key).once('value', (snapshot) => { ...}));

对此:

promises.push(admin.database().ref('/convoID/' + key).once('value').then(snapshot => {...}));

而且,如果你改变它的一般结构,它会更干净一点:

let promises = [];
snapshot.forEach((doc) => {
   promises.push(...)
});
Promise.all(promises).then(...)

对此:

Promise.all(snapshot.map(doc => {
    return admin.database().ref('/convoID/' + key).once(...).then(...);
})).then(...);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用JS Promise处理异步调用?

来自分类Dev

使用 Promise 共享异步调用的结果

来自分类Dev

递归,Node js和异步调用

来自分类Dev

Node.js杀死异步调用

来自分类Dev

Node.js /使Redis异步调用

来自分类Dev

node.js redis 异步调用

来自分类Dev

Node.js中的Promise.all不调用then函数

来自分类Dev

Node.js:从内部带有异步调用的函数返回值

来自分类Dev

Node.js:从内部带有异步调用的函数返回值

来自分类Dev

使用sequelize对MySQL的Node.js和异步调用阻止了其他用户

来自分类Dev

循环异步调用并加入返回的promise

来自分类Dev

使用Promise重写Node.js中的Redis调用

来自分类Dev

Node.js的异步调用和递归

来自分类Dev

AngularJS和Node.js的异步调用

来自分类Dev

在node.js中迭代大量异步调用/结果(使用ES6 / async / bluebird / generators)?

来自分类Dev

如何使用Express和Node进行异步调用

来自分类常见问题

Node.js-从promise.then()内部返回

来自分类Dev

Node.js-从promise.then()内部返回

来自分类Dev

Node.js表达promise.all()。then()不同步

来自分类Dev

使用promise和defer在angularJS中进行同步和异步调用

来自分类Dev

在非异步 Javascript 中使用异步调用数据,Node 到 javascript 变量复制

来自分类Dev

使用Jasmine,如何测试异步调用的返回值?

来自分类Dev

使用Promise处理Node.js中的MySQL返回值

来自分类Dev

在node.js中使用ES6 Promise返回空响应

来自分类Dev

如何在Node.js中通过异步调用重用测试功能?

来自分类Dev

Node.js并行异步调用,但具有优先级

来自分类Dev

使Node.js退出,无论本地模块异步调用是否挂起

来自分类Dev

Node.js:通过异步调用顺序完全执行Websocket响应

来自分类Dev

使用jQuery Promise模拟同步调用

Related 相关文章

  1. 1

    如何使用JS Promise处理异步调用?

  2. 2

    使用 Promise 共享异步调用的结果

  3. 3

    递归,Node js和异步调用

  4. 4

    Node.js杀死异步调用

  5. 5

    Node.js /使Redis异步调用

  6. 6

    node.js redis 异步调用

  7. 7

    Node.js中的Promise.all不调用then函数

  8. 8

    Node.js:从内部带有异步调用的函数返回值

  9. 9

    Node.js:从内部带有异步调用的函数返回值

  10. 10

    使用sequelize对MySQL的Node.js和异步调用阻止了其他用户

  11. 11

    循环异步调用并加入返回的promise

  12. 12

    使用Promise重写Node.js中的Redis调用

  13. 13

    Node.js的异步调用和递归

  14. 14

    AngularJS和Node.js的异步调用

  15. 15

    在node.js中迭代大量异步调用/结果(使用ES6 / async / bluebird / generators)?

  16. 16

    如何使用Express和Node进行异步调用

  17. 17

    Node.js-从promise.then()内部返回

  18. 18

    Node.js-从promise.then()内部返回

  19. 19

    Node.js表达promise.all()。then()不同步

  20. 20

    使用promise和defer在angularJS中进行同步和异步调用

  21. 21

    在非异步 Javascript 中使用异步调用数据,Node 到 javascript 变量复制

  22. 22

    使用Jasmine,如何测试异步调用的返回值?

  23. 23

    使用Promise处理Node.js中的MySQL返回值

  24. 24

    在node.js中使用ES6 Promise返回空响应

  25. 25

    如何在Node.js中通过异步调用重用测试功能?

  26. 26

    Node.js并行异步调用,但具有优先级

  27. 27

    使Node.js退出,无论本地模块异步调用是否挂起

  28. 28

    Node.js:通过异步调用顺序完全执行Websocket响应

  29. 29

    使用jQuery Promise模拟同步调用

热门标签

归档