Javascript Firebase云功能:Promise.all(Promise)存在问题

Javascript Firebase云功能:Promise.all(Promise)存在问题,javascript,firebase,promise,Javascript,Firebase,Promise,我循环抛出Firebase存储中的文件列表,并希望在循环时修改字符串 以下是我试图做的: var str; storage.bucket().file(...).download((err, content) => { str=content.toString(); storage.bucket().getFiles(...).then(results => { const files = results[0]; var pro

我循环抛出Firebase存储中的文件列表,并希望在循环时修改字符串

以下是我试图做的:

 var str;

 storage.bucket().file(...).download((err, content) => {
    str=content.toString();

    storage.bucket().getFiles(...).then(results => {
        const files = results[0];
        var promise = new Promise(function(resolve,reject){
           files.forEach(file => {
               ...
               str=str.replace("t","a");
           });
           resolve(str);
      });

      Promise.all(promise).then(function(str) {
        console.log(str); //NOT OKAY, the value is still "test" 

        file.save(str, function(err) { ... });
     });
我也试过:

承诺。然后(功能(结果){

但结果是一样的:(

更新: 我编辑了上面的代码,但仍然不起作用:

有什么想法吗

更新2:

 var str;

 storage.bucket().file(...).download((err, content) => {
    str=content.toString();

    storage.bucket().getFiles(...).then(results => {
        const files = results[0];
        var promise = new Promise(function(resolve,reject){
           files.forEach(file => {
               ...
               str=str.replace("t","a");
           });
           resolve(str);
      });

      Promise.all(promise).then(function(str) {
        console.log(str); //NOT OKAY, the value is still "test" 

        file.save(str, function(err) { ... });
     });


它仍然不起作用:(

看来您正在寻找

const promise = storage.bucket().file().download().then(str => {
//    ^^^^^^^^^                                   ^^^^^
    return storage.bucket().getFiles().then(results => {
//  ^^^^^^
        const files = results[0];
        for (const file of files) {
            …
            str = str.replace("t","a");
        }
        return str;
    //  ^^^^^^
    });
});

promise.then(str => { /*
^^^^^^^^^^^^ */
    console.log(str);
    return file.save(str); // should return a promise
});

您既不需要
new Promise
也不需要
Promise。所有的
都在这里。您可以使用后者来删除嵌套,甚至可以同时运行
getFiles()
download()
,请参见。

如果它对某人有用,我找到了以下解决方案:

var promises = [];
var str="string containing data to replace with signed url";

storage.bucket().getFiles({ prefix: folderPath }).then(results => {
  const files = results[0];
  files.forEach(function(file) {

     promises.push( //the trick was here

       file.getSignedUrl(signedUrlConfig).then(signedUrls => {
         ...
         surl = signedUrls[0];
         str=str.replace("a",surl); //eg: replace with signed url.
         return str;
       });
     );
  });
  Promise.all(promises).then(() => {
    console.log(str); //str contains all signed url
  });
});

请编辑问题以完整显示代码。按照您现在的显示方式,无法保证您在第一个代码块中创建的承诺与您传递给承诺的承诺相同。all()。它可能超出范围。如果您在内部执行异步操作,请不要使用
forEach
。如果您没有执行异步操作,请不要使用承诺。为什么要使用
promise。所有的
?您没有多个承诺,是吗?您的
promise
变量是在
内部创建的,然后
回调,您可以不能在外部使用它。但是
那么
已经为回调的返回值创建了一个承诺,就用它吧!@Bergi那么用什么来代替承诺。全部?或者没有forEach怎么办?我有点不知所措..异步/等待通常也是一个不错的选择。需要(并支持)节点8运行时对于Firebase函数.Promise.all best for parallel operation.WTH?您在问题中的代码中没有
文件.getSignedUrl(signedUrlConfig)
Promise调用,我们不可能想出这个解决方案。我写了“这直接指向Promise.wh”,结果是“未定义”“:这只意味着sthg之前没有时间执行,因此即使异步代码没有编写,我们也可以猜测sthg是异步的,这就是我如何想出解决方案的。