我正在使用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在完成下载之前启动了回调...
谢谢!
答案 0 :(得分:0)
您似乎可能会响应某些请求,但您正在使用阻止函数调用(名称中包含“Sync”的调用)。我不确定你是否意识到这一点在整个过程中阻塞了你的整个过程,并且如果你需要的话,它将完全破坏任何并发机会。
今天,您可以在Node中使用async
/ await
看起来是同步的,但根本不会阻止您的代码。例如,您可以使用request-promise
和mz
模块:
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
,但你可以让它等待潜在错误被提出作为承诺拒绝的例外。