Javascript 等待/异步故障
我很难让异步/等待函数与使用第三方库进行图像处理的代码一起工作。我试图让每个图像在进入下一个图像之前完成处理,但目前所有三个图像都立即开始处理,无需等待。看起来第三方库正在启动它的进程,这使得异步/等待函数认为它已经完成了,但是如何确保在3rdpartylibrary.process完成数据处理之前不处理下一个映像?我也试过把Javascript 等待/异步故障,javascript,node.js,asynchronous,promise,async-await,Javascript,Node.js,Asynchronous,Promise,Async Await,我很难让异步/等待函数与使用第三方库进行图像处理的代码一起工作。我试图让每个图像在进入下一个图像之前完成处理,但目前所有三个图像都立即开始处理,无需等待。看起来第三方库正在启动它的进程,这使得异步/等待函数认为它已经完成了,但是如何确保在3rdpartylibrary.process完成数据处理之前不处理下一个映像?我也试过把 var images = ['image', 'image2', 'image3']; async function proccess_images(images) {
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)
在3rdpartylibrary函数前面,该函数会同时停止所有图像的处理,但会在正确处理第一幅图像后导致for循环退出。你知道我做错了什么吗?你的问题似乎是你的第一个函数没有返回承诺。等待需要一个正确工作的承诺。像这样的方法应该会奏效:
await new Promise ((resolve, reject) =>
将
过程
函数定义更改为包装承诺
:
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);
}
})
});
}
关键是要删除任何
回调
引用,因为现在它返回一个承诺
,因此您可以等待它。您想将第三方库
包装在承诺中。您要做的是通过包装将回调样式转换为承诺。试试这个:
var images=['image1','image2','image3'];
//模拟第三方图书馆
常数第三方数据库={
进程:(映像,回调)=>{
log(`processing image${image}`);
设置超时(()=>{
const noError=未定义;
回调(noError,`finished processing image${image}`);
}, 1000);
}
}
异步函数过程图像(图像){
console.log('start');
for(图像的常量图像){
log(`before processing image${image}`);
等待过程(图像);
log(`after processing image${image}`);
}
console.log('done');
}
功能处理(图像){
//用承诺包裹第三方图书馆
返回新承诺((解决、拒绝)=>{
第三方数据库处理(图像,(错误,数据)=>{
如果(错误){
拒绝(错误);
}否则{
解析(数据);
}
})
})
}
process_images(images)
如果未传递回调,您的3rdpartylibrary.process
函数是否返回Promise
?这将为你简化事情。。。
function process(image) {
return new Promise((resolve,reject) => {
3rdpartylibrary.process(image, (err, data) => {
if (err) reject(err);
resolve(data);
})
})
}