Я попал в беду при использовании Promise, чтобы уйти от асинхронного эффекта - PullRequest
0 голосов
/ 02 июля 2018

Я использую node.js и mongoose, чтобы создать приложение, которое поможет пользователям анализировать определенные слова в тексте. Но это не может работать синхронно. Вот мой код:

app.post("/detector/result", function(req, res) {
  var result = {};
  var text = req.body.paragraph;
  var text2 = text.replace(/,/g, '');
  var text3 = text2.replace(/\./g, '');
  var textArr = text3.split(" ");

  new Promise(function(resolve, reject) {
    textArr.forEach(function(word) {
      grewords.find({
        English: word
      }, function(err, greword) {
        if (err) {
          console.log(err);
        } else {
          if (!(greword.length < 1 || greword == undefined)) {
            console.log(word);
            console.log(result);
            if (word in result) {
              result[word] = result[word] + 1;
            } else {
              result[word] = 1;
            }
          }
        }
      });
    });
    resolve(result);
  }).then(function(r) {
    console.log(r);
    res.render("detectorresult", {
      grewordObj: r
    });
  });
});

Когда я запускаю свой код, он все еще показывает в оболочке:

{}
adversary
{}
adventitious
{ adversary: 1 }
assertive
{ adversary: 1, adventitious: 1 }

Почему {} все еще показывается первым вместо того, чтобы показывать последним?

1 Ответ

0 голосов
/ 02 июля 2018

Вы должны понимать природу JavaScript (асинхронное программирование). Вы не можете много раз вызывать функцию resolve или reject, вы можете использовать функцию Promise.all(), следующий пример может помочь вам

app.post('/detector/result', function (req, res) {
    var result = {};
    var text = req.body.paragraph;
    var text2 = text.replace(/,/g, '');
    var text3 = text2.replace(/\./g, '');
    var textArr = text3.split(' ');

    Promise.all(textArr.map(function (word) {
        return new Promise(function (resolve, reject) {
            grewords.find({
                English: word
            }, function (err, greword) {
                if (err) {
                    console.log(err);
                    reject(err);
                } else {
                    if (!(greword.length < 1 || greword == undefined)) {
                        console.log(word);
                        console.log(result);
                        if (word in result) {
                            result[word] = result[word] + 1;
                        } else {
                            result[word] = 1;
                        }
                    }
                    resolve(greword);
                }
            });
        });
    })).then(function (r) {
        console.log('Final result ', r); // r will be an array of object as we rerturned object in each iteration 
        console.log('Final result ', result);
        res.render('detectorresult', {
            grewordObj: result
        });
    }).catch(function (err) {
        console.log('Got error ', err);
        res.status(500).send(err);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...