Можно послушать двойка (Возможно, WIA) сканер?

Ваш код неверен.

1) Не рекомендуется хранить контекстную переменную resu вне области запроса.

2) result.push? где переменная result? снова вне зоны видимости?

3) resu.length? это не массив, это объект, поэтому вы не получите результат false или 0.

4) find().distinct('tarrif_type', (err,docs) => ... Мангуст поддерживает обещания, так почему Вы использовали его с обратным вызовом?

5) await resu.length? это не обещание, это просто объект, а длина - это свойство. Вы не можете спросить await из атрибута не-обещания

6) getAll, что если resu.length действительно будет иметь 0? на что это ответит? - поэтому запрос будет зависать, поэтому Вы должны ответить на все вопросы, чтобы изящно закрыть соединение, созданное во время запроса.


Таким образом, общее исправление должно работать:

router.get('/getTarrifDetails', async (req, res) => {
  try {
    const tarrifTypes = await Tarrif.find().distinct('tarrif_type');

    const tarrifCounters = {};
    let total = 0;
    for(const tarrifType of tarrifTypes) {
      const count = await User.count({tarrif_type: tarrifType});
      tarrifCounters[tarrifType] = count;
      total+= count;
    }

    res.status(200).send({
      tarrifTypes,
      tarrifCounters,
      total
    });
  } catch(error) {
    res.status(500).send(error.message);
  }
});

или с использованием параллелизма:

const getTarrifUsersCounters = async (tarrifTypes) => {
  // initial result
  const result = {
    tarrifTypes,
    tarrifCounters: {},
    total: 0
  };

  // if no tarriffTypes passed return result
  if (!(Array.isArray(tarrifTypes) && tarrifTypes.length > 0)) {
   return result;
  }

  // generating array of promises from tarrifTypes
  const callStack = [];
  for(const tarrifType of tarrifTypes) {
    callStack.push(
      new Promise(async resolve => {
        const count = await User.count({tarrif_type: tarrifType});
        resolve({tarrifType, count});
      });
    );
  }

  // calling promises array in parallel
  if (callStack.length) {
    (await Promise.all(callStack))
      .forEach(
        ({tarrifType, count}) => {
          result.tarrifCounters[tarrifType] = count;
          result.total += count;
        });
  }

  return result;
};

router.get('/getTarrifDetails', async (req, res) => {
  try {
    const tarrifTypes = await Tarrif.find().distinct('tarrif_type');
    const result = await getTarrifUsersCounters(tarrifTypes);
    res.status(200).send(result);
  } 
  catch(error) {
    res.status(500).send(error.message);
  }
});
5
задан skaffman 15 May 2011 в 13:31
поделиться

3 ответа

Я только работал с собственными интерфейсами к TWAIN и WIA, таким образом, я не могу ручаться за эти другие слои сверху их. Однако относительно TWAIN, некоторые механизмы действительно существуют, которые позволяют приложению быть уведомленным для собирания данных. Я полагаю, что это обрабатывается с STI.dll, более старая библиотека, которая доступна на Windows 2000 +. Ищите StiCreateInstance для большего количества информации.

Если Вы принимаете решение пойти путем WIA, это намного более просто. Можно зарегистрироваться для получения событий, таких как кнопка 'сканирования' или 'изображение создало' событие. Затем все, что необходимо сделать, обработать те события для получения изображения. Самая жесткая часть этого находит аппаратные средства, которые реализуют опции, которые Вы хотите.

Microsoft имеет библиотеку автоматизации WIA, которая делает многие из этих задач намного более простыми. Это может использоваться языками сценариев.

5
ответ дан 13 December 2019 в 05:44
поделиться

Мы недавно включили TWAIN в одно из наших приложений. Мы посмотрели на WIA, но в конце TWAIN намного более гибок и может соединиться с приложениями, такими как VRS (Виртуальный ReScan). В конце это - 'получение по запросу', Вы запрашиваете сканирование и затем ожидаете сканера. Одна из хороших вещей с VRS - то, что это - программное обеспечение между нашими вызовами TWAIN и устройством, как таковым, это заботится о нескольких вещах, одна из которых является этим, желание может ожидать, фактически навсегда, для бумаги, которая будет помещена в загрузочный лоток для сканирования. Это позволяет способности 'запустить' задание сканирования и затем ожидать бумаги, она также позволяет, чтобы дополнительные страницы были добавлены к единице.

При поиске чего-то, чего немного больше 'нажатия', ориентированного затем, смотрит на сканер или MFP, который поддерживает ftp/smb/email и т.д., и позвольте ему просканировать, и можно просто контролировать папку или почтовый ящик POP3 для задания.

Можно также обратиться к устройствам MFP, которые включают (иногда в дополнительную стоимость) инструменты для помощи, такие как Шаблон ксерокса, LDSS Lexmark, DSS HP.

Вот ссылка на код TWAIN.NET, с которым мы основывали нашу интеграцию сканера: http://www.codeproject.com/KB/dotnet/twaindotnet.aspx

4
ответ дан 13 December 2019 в 05:44
поделиться

[редактирование - если бы это был я, я посмотрел бы на ответ adzm;-p]

Насколько я понимаю регулярный TWAIN является "получением по запросу", не "нажатием" от сканера. Я мог быть неправым...

Я ожидаю, что такие интерфейсы действительно существуют для верхнего уровня, сканеры большого объема (Вы знаете, те размер бильярдного стола) - но не (AFAIK) для обычных потребительских сканеров.

Для использования с.NET (и перед этим, COM), я всегда справлялся с ImageMan.

3
ответ дан 13 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: