Синатра не отправляет ответ, как только я добавляю дополнительный вызов метода - PullRequest
1 голос
/ 31 марта 2011
post '/payment/transactions/amount' do # => creates a new charge
content_type :json, :charset => 'utf-8'

class Transaction
def initialize(endUserId, code, referenceCode, callback=false)
  @endUserId = endUserId
  @code = code
  @referenceCode = referenceCode 
  $callback = callback
  $transId = rand(1000)                               
end 

def transId
  return $transId 
end

def callback
  return $callback
end 

def postCallback
  sleep(5)
  RestClient.post"#{$callback}", :message => 'CALLBACK SUCCESS', :content_type => :json
end  

def to_json(*a)     
  {"amountTransaction" => {
    "endUserId" => @endUserId,
    "paymentAmount" =>{
      "chargingInformation" => {"code" => @code, "description" => @description},
         "totalAmountCharged"=> "0" 
     },
     "referenceCode" => @referenceCode,
     "serverReferenceCode" =>"#{(0...6).map{65.+(rand(25)).chr}.join}", # just an example, can be any string
     "resourceURL" => "http://localhost:4567/payment/#{@endUserId}/transactions/amount/#{Trans.transId}",
     "transactionOperationStatus" => "Processing"
 }}.to_json(*a)
end
end 

 Trans = Transaction.new(params[:endUserId],params[:code], params[:referenceCode],    params[:callback])
 jsonTrans = Trans.to_json
 receipts.addReceipt(Trans.transId,jsonTrans)
 jsonTrans 
 # fire callback
 if Trans.callback then 
  sleep(10)
  Trans.postCallback 
 end  
end 

Проблемой для меня является код, следующий за #fire callback. Если я опущу это, если ... то, JSON-объект jsonTrans возвращается, как и ожидалось. Когда я включаю if ... then для запуска обратного вызова, то требуемый Trans.postcallback происходит через 5 секунд - но предыдущий jsonTrans не возвращается, он просто игнорируется. Есть идеи, что я делаю не так? Для подтверждения желаемое поведение - вернуть jsonTrans в HTTP-ответ, а затем вызвать метод postCallback через 5 секунд (при условии, что if оценивается как true). Ура! * * 1002

РЕДАКТИРОВАТЬ : Решено путем создания новой темы: Thread.new { если Trans.callback тогда спать (5) Trans.postCallback конец} jsonTrans

Ответы [ 2 ]

1 голос
/ 31 марта 2011

Последнее утверждение - это то, что метод возвращает (выводит), поэтому он игнорирует ваши jsonTrans в выводе.

Первая идея, которая у меня возникнет, это изменить ее порядок:

 #... 
 Trans = Transaction.new(params[:endUserId],params[:code], params[:referenceCode],    params[:callback])
 jsonTrans = Trans.to_json
 receipts.addReceipt(Trans.transId,jsonTrans) 
 # fire callback
 if Trans.callback then 
  sleep(10)
  Trans.postCallback 
 end  
 jsonTrans
end 

Это должно работать, если вы не ожидаете какого-либо вывода от этого RestClient.post -call.

0 голосов
/ 31 марта 2011

Спасибо за предложение daddz - на самом деле мне удалось решить его, обернув, породив новую ветку: Thread.new{ if Trans.callback then sleep(5) Trans.postCallback end} jsonTrans

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