writeStream 完成后如何做某事?

How to do something once writeStream is done?

需要 return 一个 zip 文件下载并解压缩后的对象。

示例代码:

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 来做,但不知道怎么做。

我假设 langnamerp() 的范围内,如果是的话:

尝试将其包装在一个承诺中:

/* 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));