承诺在流程完成之前发送解决方案

时间:2018-10-26 09:48:50

标签: node.js asynchronous download promise request

大家, 我有一个项目,要求用户下载图像并压缩它们的目标URL在哪里。在询问用户URL之后,该过程将图像异步地下载到一个目录中,但是在下载所有文件之后,我在此Promise中发送resolveresolve比我的创建文件(下载)过程要快几毫秒。整个下载过程结束后,如何发送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

2 个答案:

答案 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可能会有所帮助!

希望这会有所帮助!