Node Js Async Ожидание первого ответа Пусто

Существует более простой способ:

virtualenv venv --python=python2.7

. Благодаря комментарию это работает только если у вас установлен python2.7 на системном уровне (например, /usr/bin/python2.7).

В противном случае, если вы используете доморощенный, вы можете использовать путь, чтобы дать вам то, что вы хотите.

virtualenv venv --python=/usr/local/bin/python

Вы можете найти путь к вашей установке python с помощью

which python

Это также будет работать с python 3.

which python3
>> /usr/local/bin/python3
virtualenv venv --python=/usr/local/bin/python3

В конечном итоге сжимается до:

virtualenv venv -p `which python`
virtualenv venv -p `which python3`
1
задан oniramarf 18 January 2019 в 12:10
поделиться

2 ответа

Вы должны убедиться, что оператор await завершен, прежде чем вы сможете сравнить. Помните, что async / await не заставляет код работать синхронно, он просто форматирует его таким образом, чтобы мы, разработчики, выглядели так, как будто он синхронизирован.

function findData() {
      return Tarrif.find().distinct('tarrif_type',(err,docs)=>{
          docs.forEach(async (ele)=>{
          let count= User.countDocuments({tarrif_type:ele});
          result.push(ele);
          resu[ele]=await count;
          result.push(count);
        });
      });
    };


router.get('/getTarrifDetails',async (req,res,next)=>{
    let res = null;
    try {
       res = await findData();
    } catch(e) {
      console.log(e);
    }
    if(res !== 0){
      //do something
    } else {
      // do something else
    }

});
0
ответ дан squeekyDave 18 January 2019 в 12:10
поделиться

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

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);
  }
});
0
ответ дан num8er 18 January 2019 в 12:10
поделиться
Другие вопросы по тегам:

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