Облачная функция Firebase: проблема с Promise.all (обещание) - PullRequest
0 голосов
/ 15 декабря 2018

Я закидываю список файлов в хранилище 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) { ... });
     });

Я пробовал также:

promise.then (функция (результат) {

, но это тот же результат: (

ОБНОВЛЕНИЕ: Я редактировал приведенный выше код, но он все еще не работает:

enter image description here

Есть идеи?

ОБНОВЛЕНИЕ 2:

enter image description here

все еще не работает: (

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Если это кому-то пригодится, вот решение, которое я нашел:

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
  });
});
0 голосов
/ 16 декабря 2018

Кажется, вы ищете

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() одновременно, см. Как получить доступ к предыдущим результатам обещания в цепочке .then ()? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...