Firebase功能:嵌套的异步请求

时间:2018-07-11 19:35:53

标签: node.js asynchronous nested google-cloud-functions

我正在努力处理以下相对简单的代码:

return Promise.all(promises)
   .then(results => {
        results.forEach(element => {
            var mainKey = element.key;
            var mainValue = element.val();

            if(mainKey.toString().startsWith('us_', 0)) {
                text = text + '\n\nUser id : ' + mainKey + '\n';
                Object.keys(mainValue).forEach(function(key) {
                    text = text + mainValue[key];
                });
            }
            if(mainKey.toString().startsWith("cr_", 0)) {
                text = text + 'Creation id: ' + mainKey;
                Object.keys(mainValue).forEach(function(key) {
                    console.log(key, mainValue[key]);
                    text = text + mainValue[key];
                });
                const file = bucket.file(value["thumbnail"]); 
    //START of another level of async code 
                var url =  file.getSignedUrl({
                action: 'read',
                expires: '03-09-2491'
                }).then(signedUrls => {
                    text = text + 'URL: ' + signedUrls[0];
                    return text;
            });  
    //END of another level of async code  
            }
        });
        return sendMail(orderid, text);
    }).catch((error) => {
        console.log("sendMail failed : "+ error);
    });

使用Promises.all()执行了一些异步请求(批处理A)。到目前为止,它可以按预期工作:所有的诺言都成功执行,并返回应有的结果。现在,我需要添加另一层异步请求(批处理B),该请求将批处理A中的数据用作参数。因此,据我了解,应该是批处理A中“然后”块中的另一个Promise.all()调用。

我的理解正确吗,或者有更简单的方法来实现?您能否提供上述代码示例演示解决方案?

1 个答案:

答案 0 :(得分:1)

是的,您基本上是正确的。

then子句允许您运行使用异步调用结果的代码。然后,您可以运行更多异步调用并返回这些承诺。

使代码美观的诀窍是,当您在then子句中返回诺言时,下一个then的结果将是该诺言的结果。换句话说,诺言变平了-您不再有价值承诺,而是再次有了价值承诺。

Promise.all(promiseList)
  .then(results => Promise.all(createNewPromises(results)))
  .then(moreResults => doStuffWithMoreResults(moreResults))
  .catch(err => somethingBadHappened(err))