dbarni Ответов: 1

Пытаюсь сделать программу, дождаться возвращения из запроса с помощью jQuery.


У меня есть программа, которая должна получать свежие данные каждый раз, когда нажимается кнопка, а затем использовать эти данные для продолжения выполнения. Я прочитал тонну предложений, но ни одно из них, похоже, не работает, так что я, должно быть, делаю что-то не так. Это вызывающая функция:
function _onSpin(iNumBettingLines,iCoin,iCurBet) {
    if(iCurBet > s_aSession["iMoney"]){
        _dieError("INVALID BET: "+iCurBet+",money:"+s_aSession["iMoney"]);
        return;
    }
 makeNextResult(s_aSession["user_name"],s_aSession["coin_bet"],s_aSession["coin_bet"]);
	  responce_string = getNextResults();
    	_Result = [];
        var res_string = parseResult(response_string);
        var incomming = res_string.split("#");
        var this_ln;
        var x = 0;
        var bFreespin = 0;
        var bBonus = 0;
        var reel_pos;
        var bet_amt = 25;
        for(i=0;i<=incomming.length-1;i++){
       	   this_ln=incomming[i].split(",");
       	  _Result[i]=this_ln;
        }          
      }
      _initSettings();
      //$(s_oMain).trigger("bet_placed",{bet:iCoin,tot_bet:iCurBet});
      var rls;
      for(a=0;a<=_Result.length-1;a++){
      	if(_Result[0][0]==bet_amt){
      		rls = _Result[0][3];
      		break;
      	}
      }
  		if(rls!="undefined"){
       reel_pos =rls.split("*");
       for(a=0;a<reel_pos.length;a++){
          fs = reel_pos[a].split("%");
          _aFinalSymbols[a] = new Array(); 
          _aFinalSymbols[a][0] = fs[0];
          _aFinalSymbols[a][1] = fs[1];
          _aFinalSymbols[a][2] = fs[2];
          _aFinalSymbols[a][3] = fs[3];
          _aFinalSymbols[a][4] = fs[4];
  		 }
       
      }
       if(_Result[0][1]==0){
          var str = JSON.stringify(_aFinalSymbols);
          //_oInterface.refreshTotalBet();
          return "res=true&win=false&pattern="+JSON.stringify(_aFinalSymbols)+"&money="+s_aSession["iMoney"]+"&freespin="+s_aSession["iTotFreeSpin"]+"&bonus=false&bonus_prize=-1";
       }
   
      aRet = stuffResults(bet_amt);
      var str = JSON.stringify(_aFinalSymbols);
     // _oInterface.refreshTotalBet();
      return "res=true&win=true&pattern="+_aFinalSymbols+"&win_lines="+JSON.stringify(aRet)+"&money="+s_aSession["iMoney"]+
           "&tot_win="+iTotWin+"&freespin="+s_aSession["iTotFreeSpin"]+"&bonus="+s_aSession["bBonus"]+"&bonus_prize="+iPrizeReceived+"&cash="+s_aSession["iSlotCash"] ;
}


обратите внимание на строку "responce_string = getNextResults();"

Вот код для getNextResults()

function getNextResults(){
  foo(function(result) {
     return result;
  });
}


И наконец функция foo
function foo(result) {
   var url = "http://server678.net/ExampleService.asmx";
    $.support.cors = true;
    $.ajax({
        type: "POST",
        url: url,
        contentType: "text/xml",
        dataType: "xml",
        data: _SoaMessage,
        processData: true, 
        success: function (data, status, req) {
           result(req.responseText);
        }
    });
}


Программа вызывает getnextResult, но вместо того, чтобы ждать, пока функция вернет значение, она просто продувает его насквозь, и строка ответа всегда не определена.

Что я уже пробовал:

Я исследовал это в течение нескольких дней, и, похоже, ничего не работает. Пожалуйста помочь.

Mohibur Rashid

Самый простой способ сделать это-отключить кнопку или создать флаг, который говорит, что он обрабатывается. При возврате, успехе или неудаче, включите кнопку или снимите флаг

F-ES Sitecore

Вам нужно либо добавить "async:false" к параметрам ajax, чтобы заставить код ждать результатов вашего вызова ajax, либо перепроектировать свой код, чтобы код в событии "success" запускал все, что нужно сделать с данными.

1 Ответов

Рейтинг:
2

Mohibur Rashid

Самый простой способ сделать это-отключить кнопку или создать флаг, который говорит, что он обрабатывается. При возврате, успешном или неудачном, включите кнопку или снимите флажок.

$("#button_id").click(function(){
 if(this.enabled==false) {
   alert("still processing");
   return;
 }
 this.enabled=false;
 $.ajax(
  {
    url:...,
    success: function(result) {
     ... // Process result
    }, 
    error:function() { 
    },
    complete: function(){
      this.enabled=true
    }
  }
 )
  
})