Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待/异步故障_Javascript_Node.js_Asynchronous_Promise_Async Await - Fatal编程技术网

Javascript 等待/异步故障

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) {

我很难让异步/等待函数与使用第三方库进行图像处理的代码一起工作。我试图让每个图像在进入下一个图像之前完成处理,但目前所有三个图像都立即开始处理,无需等待。看起来第三方库正在启动它的进程,这使得异步/等待函数认为它已经完成了,但是如何确保在3rdpartylibrary.process完成数据处理之前不处理下一个映像?我也试过把

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);
   })
 })
}