async ждут внутри async.parallel, обратный вызов стал неопределенным - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь сделать async / await внутри async.parallel, но не могу вызвать обратный вызов. Но если я удалю async / await, обратный вызов может быть вызван. Ниже приведен код

let parallelFunc = listCamId.map(camId => {
    return async function (callback) {
      let insertRuleTransParam = {
        rule_id: ruleId,
        camera_id: camId,
        vas_id: vasId,
        additional_parameter: additionalParameter
      }

      let configParamCamera = { where: { id: camId } };
      let configParamRule = { where: { id: ruleId } };

      try {
        let ruleTrans = await createRuleTransaction(insertRuleTransParam);
        let rule = await ruleService.find(configParamRule, "one");
        let cam = await cameraService.find(configParamCamera, "one");
        let uri = await constructCamUri(cam.protocol, cam.user_access, cam.password, cam.ip_address, cam.port, cam.path);
        let visionParam = await startVasRule(vasId, ruleTrans.id, camId, rule.rule_path, rule.rule_exec, uri);
        let updateRuleParam = {
          port_stream: visionParam.port,
          url_stream: visionParam.url,
          mmap_in: visionParam.mmap_in,
          mmap_out: visionParam.mmap_out
        }
        await updateRuleTransaction(updateRuleParam);
        callback(null);
      } catch (e) {
        callback(e);
      }
    }
  })

  return new Promise((resolve, reject) => {
    async.parallel(parallelFunc, function (err, results) {
      if (err) {
        reject(err);
      } else {
        resolve('success');
      }
    })
  });

Может кто-нибудь указать, что не так с кодом?

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Вы можете использовать async / await внутри async.js

В вашем коде есть большая ошибка:

return async function (callback) {}

Асинхронные функции не требуют или не требуют callback, они являются сокращением для Promises

Вот простой пример async function, который будет работать в async.js:

async function forAsync() {
  try {
    let user = await db.findOne({});
    return user // this is equivalent to resolve(user)
  } catch (e) {
    throw(e) // this is equivalent to reject(err)
  }
}

Как Promise это будет выглядеть следующим образом:

function forAsync() {
  return new Promise((resolve,reject) => {
    db.findOne({}, (err,res) => {
      if (err) reject(err)
      let user = res;
      resolve(user);
    });
  }
}

Как callback это будет выглядеть следующим образом:

function forAsync(callback) {
  db.findOne({}, (err,res) => {
    if (err) callback(err)     
    let user = res;     
    callback(null, user);
  });
}
0 голосов
/ 04 мая 2018

Не используйте библиотеку async.js для кода обещания и не используйте параметры обратного вызова. Просто используйте Promise.all, чтобы дождаться нескольких вещей:

let promises = listCamId.map(async function(camId) {
  let insertRuleTransParam = {
    rule_id: ruleId,
    camera_id: camId,
    vas_id: vasId,
    additional_parameter: additionalParameter
  }

  let configParamCamera = { where: { id: camId } };
  let configParamRule = { where: { id: ruleId } };

  let ruleTrans = await createRuleTransaction(insertRuleTransParam);
  let rule = await ruleService.find(configParamRule, "one");
  let cam = await cameraService.find(configParamCamera, "one");
  let uri = await constructCamUri(cam.protocol, cam.user_access, cam.password, cam.ip_address, cam.port, cam.path);
  let visionParam = await startVasRule(vasId, ruleTrans.id, camId, rule.rule_path, rule.rule_exec, uri);
  let updateRuleParam = {
    port_stream: visionParam.port,
    url_stream: visionParam.url,
    mmap_in: visionParam.mmap_in,
    mmap_out: visionParam.mmap_out
  }
  await updateRuleTransaction(updateRuleParam);
  return null;
});
return Promise.all(promises);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...