使用node.js和wget,等待下载结束

时间:2017-07-06 13:50:55

标签: javascript node.js wget

我正在使用wget下载一些图像,但有时图像不会完全下载(它从顶部开始,然后突然停止......) 这是我的代码:

try {
  var img = fs.readFileSync(pathFile);
}
catch (err) {
  // Download image
  console.log('download')
  wget({
    url: reqUrl,
    dest: pathFile,
    timeout : 100000
  }, function (error, response, body) {

    if (error) {
      console.log('--- error:');
      console.log(error);            // error encountered 
    } else {
      console.log('--- headers:');
      console.log(response); // response headers 
      console.log('--- body:');
      //console.log(body);             // content of package 
      var img = fs.readFileSync(pathFile);

依旧......

基本上,它试图找到位于pathFile的文件,如果他不存在,我会用wget在我的服务器上下载它。但似乎wget在完成下载之前启动了回调...

谢谢!

1 个答案:

答案 0 :(得分:0)

您似乎可能会响应某些请求,但您正在使用阻止函数调用(名称中包含“Sync”的调用)。我不确定你是否意识到这一点在整个过程中阻塞了你的整个过程,并且如果你需要的话,它将完全破坏任何并发机会。

今天,您可以在Node中使用async / await看起来是同步的,但根本不会阻止您的代码。例如,您可以使用request-promisemz模块:

const request = require('request-promise');
const fs = require('mz/fs');

现在你可以使用:

var img = await fs.readFile(pathFile);

没有阻塞,但仍然允许您在下一条指令运行之前轻松等待文件加载。

请记住,您需要在使用async关键字声明的函数中使用它,例如:

(async () => {
  // you can use await here
})();

您可以使用以下命令获取文件:

const contents = await request(reqUrl);

你可以写下:

await fs.writeFile(name, data);

没有必要使用阻止调用。

您甚至可以使用try / catch

let img;
try {
  img = await fs.readFile(pathFile);
} catch (e) {
  img = await request(reqUrl);
  await fs.writeFile(pathFile, img);
}
// do something with the file contents in img

甚至可以争辩说你可以删除最后一个await,但你可以让它等待潜在错误被提出作为承诺拒绝的例外。