Node.js 使用承诺运行并发firebase请求

Node.js 使用承诺运行并发firebase请求,node.js,firebase,firebase-realtime-database,promise,google-cloud-functions,Node.js,Firebase,Firebase Realtime Database,Promise,Google Cloud Functions,我正在尝试使用Promise.all()并发执行Firebase云存储查询的数量: 我希望看到每个已执行承诺的完整查询结果,但我得到的是以下结果: 结果: https://....firebaseio.com/creations/cr_1bfd5f16212f44c792a2cbe3e9c6e4cc https://....firebaseio.com/creations/cr_343c363c2a214487ba8cb7101653f6af https://....firebaseio.com

我正在尝试使用Promise.all()并发执行Firebase云存储查询的数量:

我希望看到每个已执行承诺的完整查询结果,但我得到的是以下结果:

结果:

https://....firebaseio.com/creations/cr_1bfd5f16212f44c792a2cbe3e9c6e4cc
https://....firebaseio.com/creations/cr_343c363c2a214487ba8cb7101653f6af
https://....firebaseio.com/creations/cr_e3f7a0bafd1542ac898d96e86155b94e
https://....firebaseio.com/users/us_5e4c28e18e63454c861caa5c4fe6a6f0

我遗漏了什么吗?

以下内容应该可以解决问题

详情如下:

Promise.all(iterable)
方法返回一个 当
iterable
参数中的所有承诺都已执行时解析 已解决或当
iterable
参数不包含承诺时。信息技术 以拒绝的第一个承诺为理由拒绝

因此,您需要向
promissions
数组添加一些承诺

once()
方法确实返回承诺,如文档中所述

exports.onNewOrder = 
functions.database.ref('/orders/{orderId}').onCreate(event => {  
    const data = event.val();
    const orderedBy = data.ordered_by;
    const creations = data.creations;

    const promises = []

    for (var entry of creations.entries()) {
        var key = entry[0];
        var creationPromise = admin.database().ref("creations/"+ key).once("value");
        promises.push(creationPromise);
    }

    const userPromise = admin.database().ref("users/"+ orderedBy).once("value");
    promises.push(userPromise);

    return Promise.all(promises)
    .then(results => {
        console.log("results: " + results);
        return true;
        //actually here you will probably do something else than just write the results to the console. 
        //In this case you should return a promise (instead of true).
    }).catch((error) => {
        console.log("sendMail failed : "+ error);
        return false;
    });

});

下面的内容应该可以做到这一点

详情如下:

Promise.all(iterable)
方法返回一个 当
iterable
参数中的所有承诺都已执行时解析 已解决或当
iterable
参数不包含承诺时。信息技术 以拒绝的第一个承诺为理由拒绝

因此,您需要向
promissions
数组添加一些承诺

once()
方法确实返回承诺,如文档中所述

exports.onNewOrder = 
functions.database.ref('/orders/{orderId}').onCreate(event => {  
    const data = event.val();
    const orderedBy = data.ordered_by;
    const creations = data.creations;

    const promises = []

    for (var entry of creations.entries()) {
        var key = entry[0];
        var creationPromise = admin.database().ref("creations/"+ key).once("value");
        promises.push(creationPromise);
    }

    const userPromise = admin.database().ref("users/"+ orderedBy).once("value");
    promises.push(userPromise);

    return Promise.all(promises)
    .then(results => {
        console.log("results: " + results);
        return true;
        //actually here you will probably do something else than just write the results to the console. 
        //In this case you should return a promise (instead of true).
    }).catch((error) => {
        console.log("sendMail failed : "+ error);
        return false;
    });

});

顺便说一句,你的问题没有一个标记为已回答。接受答案并向上投票是我们鼓励其他用户帮助我们的少数方法之一;也让其他用户更容易找到有用的帖子。如果你对答案不感兴趣,为什么有人会抽出时间来写呢。如何将问题标记为已回答?每个答案的左边都有一个复选标记。单击复选标记以获得以下答案。。。回答了你的问题。对于有帮助的(其他)答案,请单击它们旁边的“向上投票”按钮。顺便说一句,您的任何问题都没有标记为已回答。接受答案并向上投票是我们鼓励其他用户帮助我们的少数方法之一;也让其他用户更容易找到有用的帖子。如果你对答案不感兴趣,为什么有人会抽出时间来写呢。如何将问题标记为已回答?每个答案的左边都有一个复选标记。单击复选标记以获得以下答案。。。回答了你的问题。对于(其他)有帮助的答案,请单击旁边的向上投票按钮。谢谢,承诺现在似乎起作用了,尽管控制台显示
结果:[object]
。我还缺少什么吗?
Promise的结果。all(promises)
通常是一个包含所有承诺结果的数组,与您在
promises
数组中推送承诺的顺序相同。所以一定是出了什么问题,但如果没有更多的细节,很难确切知道原因。我忘了感谢你最后的评论。谢谢!它有帮助:返回Promise.all(promises).then(results=>{results.forEach(element=>{…});返回sendMail(orderid,text);}).catch((error)=>{console.log(“sendMail失败:+error);});很高兴我能帮助你!您可以通过单击答案左侧的灰色复选标记来接受我的答案。谢谢,虽然控制台显示了
结果:[object]
,但承诺现在似乎起作用了。我还缺少什么吗?
Promise的结果。all(promises)
通常是一个包含所有承诺结果的数组,与您在
promises
数组中推送承诺的顺序相同。所以一定是出了什么问题,但如果没有更多的细节,很难确切知道原因。我忘了感谢你最后的评论。谢谢!它有帮助:返回Promise.all(promises).then(results=>{results.forEach(element=>{…});返回sendMail(orderid,text);}).catch((error)=>{console.log(“sendMail失败:+error);});很高兴我能帮助你!您可以通过单击答案左侧的灰色复选标记来接受我的答案。谢谢