@SkyTaurus

Nodejs Почему данные отсылаются раньше?

Добрый день.
Есть следующий код (coffeescript)
Q = require("q")

class TreeObjectBuilder
  constructor:

  @data =
      userID: @userID
      is_authorized: false
      list: []
      properties: []

getProductPropertyIds: (id)->
    deferred = Q.defer();
    sql= "формирование sql"
    myResult = []

    @db.dquery(sql).then (rows) =>
      if rows.length > 0
        for row in rows
          myResult.push row.property_value_id
        console.log "myResult", id, "=>", myResult.join(",")
        deferred.resolve myResult
    
    deferred.promise;

  lastWithSQL: (sql)->
    console.log "lastWithSQL start"    
    @db.dquery(sql).then (rows) =>
        #заполнение массива array данными из базы

        #присвоение результата       
        @data.properties = array
        console.log "data3", @data
      return

  testPro: ->
    console.log "testPro start"

    

    reqs= []
    reqs.data = []
    for filter, i in @filters
      console.log filter.values
      reqs.push( @getProductPropertyIds( filter.values ) );
    
    Q.all(reqs).done =>
      sql = " формирование sql"
      console.log "------------>sql1=", sql
      return @lastWithSQL sql      

  last: ->
      console.log "call testPro"
      @testPro()
      console.log "end call testPro"

  build: ->
    promises = []    
    promises.push @last()
    Q.all promises


class TreePresenter
  tree_object: (count_properties, _ids)->
    _tree_object = new TreeObjectBuilder
    _tree_object.build().then =>
      console.log "build_then"
      console.log _tree_object.data
      
    , (error) ->
      console.error error.stack


Разбираюсь с асинхронной работой и запутался, данные уходят на клиента раньше, чем они прочитаются из базы, т.е. в консоли вывод такой:
call testPro
testPro start
end call testPro
lastWithSQL start
data3
build_then

Мне же нужно чтобы последовательность вывода была такая:
call testPro
testPro start
end call testPro
build_then
lastWithSQL start
data3

Я так понимаю, что у меня не дожидается выполнения функции lastWithSQL.
Не могу понять в чем дело.
  • Вопрос задан
  • 120 просмотров
Пригласить эксперта
Ответы на вопрос 2
у вас _tree_object.build() возвращает промис, соответственно после его завершения будет выполнено .then => console.log "build_then"..... т.е. build_then выполняется последний по логике кода в данном случае
Ответ написан
Комментировать
@SkyTaurus Автор вопроса
Что-то не понимаю, как исправить, чтобы дожидалось выполнения lastWithSQL
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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