Как убедиться, что функция полностью выполнена, прежде чем ее значение передается в res.render? - PullRequest
0 голосов
/ 22 июня 2019

Я хочу проанализировать адресный запрос и вернуть адреса и их названия, так что http://localhost:3000/I/want/title/?address=google.com&address=youtube.com вернет: google.com - "google", youtube.com - "youtube"

IЯ использую cheerio.js для извлечения заголовка из URL-адресов, но требуется время, и строка res.render выполняется до того, как переменные заголовки заполняются заголовками URL-адресов.Как мне убедиться, что мой код для получения заголовков выполнен до res.render?

На данный момент я не получаю никаких ошибок, но массив title [] отправляется без данных в мой.EJS файл.Я пытался решить эту проблему с помощью обратных вызовов, step.js, async.js, но, похоже, ничего не работает.Я попытался решить его с помощью rsvp.js (обещание), как показано ниже (из app.js), но он тоже не работает, а title [] остается пустым:

app.get("/I/want/title/", function(req,res){


  if (typeof req.query.address === "string"){
  query = [req.query.address];
}
  else {
  query = req.query.address;
}

  var titles=[];

  var promise = new RSVP.Promise(function(resolve, reject) {
      for (i=0;i<(query.length);i++){
        if (!((query[i]).startsWith("https://www."))){
          var url = "https://www." + query[i];
        }else{
          url=query[i];
        }

        request(url, function (err, resp, body) {
          if (err) {
            var title = "NO RESPONSE"
          } else {
          var $ = cheerio.load(body);
          var title = $("title").text();
        }
          titles.push(title);
        });

      }
      resolve(titles);
      reject();
});

promise.then(function(titles) {
  res.render("title", {url: query, siteName: titles});
}).catch(function() {
  console.log("oh no");
});
});

Что-то не так смой синтаксис или логика?Как мне выполнить это с обратными вызовами или обещаниями?

Ответы [ 2 ]

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

Ваше решение должно быть внутри остальной части обратного вызова запроса, а отклонение должно быть внутри if (err).

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

Вы должны поместить отклонение и разрешение обещания в обратный вызов запроса, тогда ваш код должен работать нормально (как показано ниже).

app.get('/I/want/title/', function(req, res) {
    if (typeof req.query.address === 'string') {
        query = [req.query.address]
    } else {
        query = req.query.address
    }

    var titles = []

    var promise = new RSVP.Promise(function(resolve, reject) {
        for (i = 0; i < query.length; i++) {
            if (!query[i].startsWith('https://www.')) {
                var url = 'https://www.' + query[i]
            } else {
                url = query[i]
            }

            request(url, function(err, resp, body) {
                if (err) {
                    var title = 'NO RESPONSE'
                    reject()
                } else {
                    var $ = cheerio.load(body)
                    var title = $('title').text()
                }
                titles.push(title)
                resolve(titles)
            })
        }
    })

    promise
        .then(function(titles) {
            res.render('title', {url: query, siteName: titles})
        })
        .catch(function() {
            console.log('oh no')
        })
})

Это отвечает на ваш вопрос?

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