Promise.map:超出最大调用堆栈大小

时间:2019-01-02 14:48:52

标签: javascript node.js promise es6-promise bluebird

我使用bluebirds Promise.map()方法运行100,000个Firebase查询,如下所示,该函数大约需要运行10秒钟。如果我将并发设置为高于1000,那么我会收到错误

  

超出了最大调用堆栈大小

关于如何解决此问题以及如何加快速度的任何想法。在我看来,也许Promise.map()可能不是使用的正确函数,或者我可能以某种方式对内存进行了错误管理。任何想法谢谢你。

exports.postMadeByFriend = functions.https.onCall(async (data, context) => {
            const mainUserID = "hJwyTHpoxuMmcJvyR6ULbiVkqzH3";
            const follwerID = "Rr3ePJc41CTytOB18puGl4LRN1R2"
            const otherUserID = "q2f7RFwZFoMRjsvxx8k5ryNY3Pk2"

            var refs = [];

            for (var x = 0; x < 100000; x += 1) {

                if (x === 999) {
                    const ref = admin.database().ref(`Followers`).child(mainUserID).child(follwerID)
                    refs.push(ref);
                    continue;
                }
                const ref = admin.database().ref(`Followers`).child(mainUserID).child(otherUserID);
                refs.push(ref);
            }

            await Promise.map(refs, (ref) => {
                return ref.once('value')
            }, {
                concurrency: 10000
            }).then((val) => {
                console.log("Something happened: " + JSON.stringify(val));
                return val;
            }).catch((error) => {
                console.log("an error occured: " + error);
                return error;
            })

编辑

const runtimeOpts = {
    timeoutSeconds: 300,
    memory: '2GB'
  }

exports.postMadeByFriend = functions.runWith(runtimeOpts).https.onCall(async (data, context) => {
            const mainUserID = "hJwyTHpoxuMmcJvyR6ULbiVkqzH3";
            const follwerID = "Rr3ePJc41CTytOB18puGl4LRN1R2"
            const otherUserID = "q2f7RFwZFoMRjsvxx8k5ryNY3Pk2"

            var refs = [];

            for (var x = 0; x < 100000; x += 1) {

                if (x === 999) {
                    const ref = admin.database().ref(`Followers`).child(mainUserID).child(follwerID)
                    refs.push(ref);
                    continue;
                }
                const ref = admin.database().ref(`Followers`).child(mainUserID).child(otherUserID);
                refs.push(ref);
            }

            await Promise.map(refs, (ref) => {
                return ref.once('value')
            }, {
                concurrency: 10000
            }).then((val) => {
                console.log("Something happened: " + JSON.stringify(val));
                return val;
            }).catch((error) => {
                console.log("an error occured: " + error);
                return error;
            })

1 个答案:

答案 0 :(得分:-1)

更新: 如果目标是拥有许多朋友发帖,那么更好的方法是拥有云功能,该功能可以在保存到数据库的每个新帖子上增加一个计数器。这样,您无需计算即可获得帖子数。

这里是similar answer和一个code sample with the like counter

原始答案: 您可以尝试增加分配给您的Cloud Funciton的内存:

  1. 在Google Cloud Platform控制台中,从左侧菜单中选择“ Cloud Functions”。
  2. 通过在功能列表中单击功能名称来选择功能。
  3. 单击顶部菜单中的“编辑”图标。
  4. 从标记为“已分配内存”的下拉菜单中选择一个内存分配。
  5. 单击“保存”以更新功能。

Manage functions deployment页中所述