代码之家  ›  专栏  ›  技术社区  ›  Julien

FireBase云功能:Promise.All的问题(Promise)

  •  -1
  • Julien  · 技术社区  · 5 年前

    我循环抛出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) { ... });
         });
    

    我也尝试过:

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

    但结果是一样的:(

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

    enter image description here

    有什么想法吗?

    更新2:

    enter image description here

    它仍然不起作用:(

    2 回复  |  直到 5 年前
        1
  •  0
  •   Julien    5 年前

    如果它对某人有用,我发现的解决方案是:

    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
      });
    });
    
        2
  •  -1
  •   Bergi    5 年前

    你好像在找

    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.all 在这里。但是,您可以使用后者删除嵌套,甚至可能运行 getFiles() download() 同时,请参见 How do I access previous promise results in a .then() chain? .