Пожалуйста, я пытаюсь объединить строковый результат с переменной в экспресс-маршрутизаторе, но он возвращает пустую строку - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь перебрать массив, получить значение и выполнить поиск в базе данных, затем объединить результат базы данных со строкой перевода

app.get('/translate',function(req,res) {
  let translate = '';
  ['hello','love'].forEach(async (word) => {
  let trans = await 
  NaijaLang.find({"engword": word, "naijalang": "yoruba"});
    translate +=" " + trans[0].translation; 
    //Returns values
    console.log(translate)
  });

  //Returns Empty String;

  console.log(translate)
  res.send(translate);
});

1 Ответ

0 голосов
/ 30 июня 2018

Потому что вы делаете там некоторые асинхронные операции, но отправляете значение синхронно. По сути, этот код будет работать в следующем порядке:

  1. пробег let translate='';
  2. пробег ['hello','love'].forEach(...)
  3. выполнить await NaijaLang.find(...) асинхронно для слова = привет
  4. запустить await NaijaLang.find(...) асинхронно для слова = любовь
  5. пробег console.log(translate) и res.send(translate);
  6. разрешить значение await NaijaLang.find(...) -> это время, когда translate обновляется в первый раз (либо для слова = привет, либо слова = любовь. Что бы ни заканчивалось раньше)
  7. разрешить значение второго вызова await NaijaLang.find(...) -> это время, когда translate обновляется во второй раз. Но значение уже было отправлено на 5 шаге.

Более подробное объяснение вы можете найти здесь: https://blog.lavrton.com/javascript-loops-how-to-handle-async-await-6252dd3c795

И там также можно найти, как это исправить. Вы можете использовать цикл for вместо forEach:

app.get('/translate',function(req,res){
    let translate='';

    for (let word of ['hello','love']) {
        let trans=await NaijaLang.find({"engword":word,"naijalang":"yoruba"});
        translate+=" " + trans[0].translation; 
        //Returns values
        console.log(translate)
    }
    //Returns Empty String;

    console.log(translate)
    res.send(translate);
});

На этот раз код будет выполняться так, как вы, вероятно, хотите Сначала для word = hello будет вызван метод find, затем после завершения выполнения будет вызван метод find для word = love и, наконец, после завершения обоих вызовов будет вызван res.send .

...