Как сделать что-то, когда writeStream будет сделано? - PullRequest
0 голосов
/ 07 октября 2018

Необходимо вернуть объект после загрузки и извлечения архива.

Пример кода:

return rp(distantFile)
.pipe(fs.createWriteStream("./temp/" + zipName))
.on('close', async function () {
    console.log('File written!');
    try {
        // Extraction
        await extract("./temp/" + zipName,
           { dir: "./public/subs/" + name },
           async function (err) {
              // extraction is complete. make sure to handle the err
              if (err) console.log(err)
              console.log("Extraction done!");

              // Remove .zip in /temp once extracted
              await rimraf('./temp/' + zipName,
                  { disableGlob: true },
                  function(){
                     /* do nothing */ 
                  });

              const movieSubs = {
                  language: lang,
                  directory: "/subs/" + name + "/" + name + '.vtt'
              };

              return movieSubs;

          })
     }
     catch(ex) {
         console.log(err)
     }
})

При console.log(movieSubs), он показывает мне объект потока со множеством свойств.Похоже, что writeStream еще не закрыт.

Предпочел бы сделать это с помощью axios, но понятия не имею, как.

1 Ответ

0 голосов
/ 07 октября 2018

Я предполагаю, что lang и name находятся в пределах действия rp(), если это так:

Попробуйте заключить его в обещание:

/* with name and lang in scope */
function test(name, lang){
  return new Promise((resolve, reject) =>
    rp(distantFile)
      .pipe(fs.createWriteStream("./temp/" + zipName))
      .on('close', async function () {
        ...
        const movieSubs = {
                  language: lang,
                  directory: "/subs/" + name + "/" + name + '.vtt'
              };
        resolve(movieSubs);
      }
  );
}

test().then(val => console.log('MOVIE_SUBS: ', val));
...