麻烦等待/异步

时间:2018-04-18 21:53:37

标签: javascript node.js asynchronous promise async-await

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循环退出。关于我做错了什么的任何想法?

3 个答案:

答案 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)