var images = ['image', 'image2', 'image3'];
async function proccess_images(images) {
for (const image of images) {
await postprocess(image)
}
console.log('done'); //this prints out before for loop is finished
}
async function postprocess(image) {
await process(function(data) {
console.log(data);
}, image)
};
function process(callback, image) {
3rdpartylibrary.process(image, (err, data) => {
if(err) {
console.error(err);
} else {
console.log('not done')
callback(data);
}
})
}
proccess_images(images)
我无法使用我的代码获取异步/等待功能,该代码使用第三方库进行一些图像处理。在尝试移动到下一个图像之前,我试图让每个图像完成处理,但是目前所有三个图像都立即开始处理而无需等待。看起来第三方库正在启动它的过程,这使得async / await函数认为它完成了,但是如何确保下一个图像没有被处理,直到AFTER 3rdpartylibrary.process处理完数据?我也尝试过把
await new Promise ((resolve, reject) =>
在3rdpartylibrary函数前面,它们同时停止所有处理,但是在正确处理第一个图像后导致for循环退出。关于我做错了什么的任何想法?
答案 0 :(得分:1)
您的问题似乎是您的第一个功能未返回承诺。等待需要承诺才能正常工作。这样的事情应该有效:
async function postprocess(image) {
var output = await process(image);
console.log(output);
};
function process(image) {
return new Promise((resolve, reject) => {
3rdpartylibrary.process(image, (err, data) => {
if(err) {
console.error(err);
reject(err);
} else {
console.log('not done')
resolve(data);
}
})
});
}
答案 1 :(得分:1)
更改process
函数定义以包装Promise
:
function process(image) {
return new Promise((resolve,reject) => {
3rdpartylibrary.process(image, (err, data) => {
if (err) reject(err);
resolve(data);
})
})
}
关键点是删除所有callback
引用,因为现在它返回Promise
,因此您可以await
。
答案 2 :(得分:0)
您希望将3rdpartylibrary
包装在承诺中。你想要做的是通过包装将回调样式转换为promise。 This is a good article to refer to.试试这个:
var images = ['image1', 'image2', 'image3'];
// mock thirdPartyLibrary
const thirdPartyLibrary = {
process: (image, callback) => {
console.log(`processing image ${image}`);
setTimeout(() => {
const noError = undefined;
callback(noError, `finished procesing image ${image}`);
}, 1000);
}
}
async function proccess_images(images) {
console.log('start');
for (const image of images) {
console.log(`before processing image ${image}`);
await process(image);
console.log(`after processing image ${image}`);
}
console.log('done');
}
function process(image) {
// wrap thirdPartyLibrary in promise
return new Promise((resolve, reject) => {
thirdPartyLibrary.process(image, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
})
})
}
proccess_images(images)