@Axepec

Асинхронная noda, любимая, из функции не передается результат?

Мужики, гляньте код пожалуйста, 3 часа бьюсь, с нодой пока на Вы, с этой асинхронностью не могу справиться, не могу вкурить как выдать объект из функции:

parserGame = (game) ->

  link = game.link
  name = game.name

  resultOneGame =
    name: ''
    days: []

  needle.get link, (err, res) ->
    if !err && res.statusCode == 200

      allDate = []

      $ = cheerio.load(res.body)

      defaultGame = []
      $('.boxesDay').find('.boxes').find('td.box').find('span.time').contents().each ->
        defaultGame.push(this.data.substring(0,5))


      $('.col-header').each ->

        if $(this).parent().hasClass('time') == false

          dayGame =
            date: ''
            game: []

          dayGame.date = $(this).text().slice(0,8)



          defaultGame.forEach (item, i) ->
            arr = [item]
            dayGame.game[i] = arr
            # dayGame.game[i].playd = false

          i = 0


          $(this).next().find('td.box').each ->

            if $(this).hasClass('reserveding')

              obj =
                playd: true

              dayGame.game[i].push(obj)



            $(this).find('span.cell').each ->

              $(this).find('input').each ->

                dayGame.game[i].push(this.attribs.value)
            i++

          # Правильно
          allDate.push(dayGame)

      resultOneGame.name = name
      resultOneGame.days = allDate

      # console.log resultOneGame ----- ВОТ ЗДЕСЬ ВСЕ ЕСТЬ
      return resultOneGame


  return resultOneGame ----- ВОТ ТУТ УЖЕ НЕТ
  • Вопрос задан
  • 258 просмотров
Решения вопроса 1
@pekc83
return resultOneGame ----- ВОТ ТУТ УЖЕ НЕТ
Правильно будет вот тут ЕЩЕ нет! Потому что в этот момент функция переданная в needle.get еще даже не начала выполняться. Вариантов решения много.
Я с CS не дружу, поэтому примеры на JS:
1) Классический
function parserGame(game, callback) {
..............
if (err || res.statusCode != 200)
  return callback(new Error());
...............
// console.log resultOneGame ----- ВОТ ЗДЕСЬ ВСЕ ЕСТЬ
return callback(null, resultOneGame);
  }
};

function callback(error, resultOneGame) {
 // получаем результат
}


2) Promise
function parserGame(game) {
  return new Promise(reject, resolve) {
  .................................
  if (err || res.statusCode != 200)
    reject(new Error());
  ................................
  // console.log resultOneGame ----- ВОТ ЗДЕСЬ ВСЕ ЕСТЬ
  resolve(resultOneGame);
  }
}

parserGame(game).then(function(resultOneGame) {
// получаем результат
}).catch(function(err){});
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
miraage
@miraage
Старый прогер
Почитайте про контекст, области видимости и асинхронный flow в javascript.
Тогда и получите ответ на свой вопрос.
Ответ написан
@Axepec Автор вопроса
Антон подскажи пожалуйста... Вызываю функцию... в callBacke все есть. Получилось. НО собака такая при вызове функции результат выдает ->

PassThrough {
  _readableState: 
   ReadableState {
     objectMode: false,
     highWaterMark: 16384,
     buffer: BufferList { head: null, tail: null, length: 0 },
     length: 0,
     pipes: null,
     pipesCount: 0,
     flowing: null,
........................................................................


а должен выдать объект

getResultOneGame = (error, resultParse) ->
  console.log resultParse
  return resultParse


вызов идет естественно основной функции..... Ппцц

Хотя создал тестовые функции, передав структуру приложения, все гуд.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы