大家,
我有一个项目,要求用户下载图像并压缩它们的目标URL在哪里。在询问用户URL之后,该过程将图像异步地下载到一个目录中,但是在下载所有文件之后,我在此Promise中发送resolve
。 resolve
比我的创建文件(下载)过程要快几毫秒。整个下载过程结束后,如何发送resolve
?
const download = (uri, filename, callback) => {
request.head(uri, (err, res, body) => {
if(err) return callback(err);
request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
};
const downloadImages = (target, inputPath) => {
return new Promise((resolve, reject) => {
resource(target)
.then(res => {
let count = 0;
for(let obj in res) {
download(res[obj].request.request.url, path.join(path.parse(inputPath).dir, path.parse(url.parse(res[obj].request.request.url).pathname).base), (err) => {
if(err) reject(err);
console.log(`${path.parse(url.parse(res[obj].request.request.url).pathname).base} file created!`);
count++;
console.log(count);
});
};
resolve(true);
})
.catch(err => {
reject(err);
});
});
};
const compressImages = (inputPath, outputPath, target) => {
return new Promise((resolve, reject) => {
downloadImages(target, inputPath)
.then(res => {
if(res === true) {
console.log('succeed!');
};
})
.catch(err => {
reject(err);
});
});
};
compressImages('lib/img/*', 'lib/cimg/', 'https://webmedya.com.tr').then(res => {
if(res === true) console.log('got it!!!')
}).catch(err => {
console.log(err);
});
此过程的结果是:
succeed!
got it!!!!!!!!
*after a 10-25 miliseconds*
webmedya-logo.png file created!
1
google-ajansi-ankara.jpg file created!
2
google-ile-zirveye.png file created!
3
adwords-reklam.png file created!
4
youtube-reklam-logo.png file created!
5
答案 0 :(得分:1)
由于您的download
函数是异步回调,因此resolve
不会等到download
内部调用回调。也许用诺言包装download
并通过for循环调用Promise.All
制成的数组就可以了。
答案 1 :(得分:1)
您能否通过添加IIFE和计数器来尝试编辑for循环?像这样:
img = Image.open('C:\\Users\\ece\\Desktop\\validation\\validate\\small_0002_7.jpg')
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
images = np.vstack([x])
classes = autoencoder.predict(images)
理想情况下,建议您不要使用回调-承诺的组合。
如果仅打算使用Promise,请尝试使用Bluebird,对于回调async可能会有所帮助!
希望这会有所帮助!