2016-04-09 8 views
0

Bir dinlenme servisine değerleri gönderen ve yanıtı geri gönderen bir ext js.file üzerinde bir xhr işlevim var. Bu işlevi açık tıklama olayında btn olarak adlandırıyorum. ilk defa "undefined" yanıtı veriyor ve düğmeye tekrar basdığımda doğru değerle cevap veriyor. Hemen hemen yanıtımın anlık olmadığından emin değilim, fakat neden değeri değerinceye kadar bekleyemiyorsa, o zaman bana önceden tanımlanmamış mesaj göndermek yerine, geri dönüş değerine atayın. Eğer Ulaştırma çağırdığınızdaişlevi, doğru değer atanmadan önce yanıtın atanmasını beklemiyor

var b; 

function Transport(parameters, Page) { 

    var http = new XMLHttpRequest(); 

    http.open("POST", "http://***.***.***.***/" + Page, true); 

    //Send the proper header information along with the request 
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    http.setRequestHeader("Content-length", parameters.length); 

    http.onreadystatechange = function() { //Call a function when the state changes. 
     if (http.readyState == 4 && http.status == 200) { 

      b = http.response; 
     } 
    } 
    http.send(parameters); 
    return b; 
} 

sayfadaki fonksiyonunun çağrı

var transaction = Transport(parameters,"/mypage.php"); 
alert(transaction); 

cevap

1

...

function doSomethingWithMyData(data) { 
    ... 
} 

function Transport(parameters, page) { 
    var http = new XMLHttpRequest(); 

    http.open("POST", "http://***.***.***.***/" + page, true); 

    //Send the proper header information along with the request 
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    http.setRequestHeader("Content-length", parameters.length); 

    http.onreadystatechange = function() { //Call a function when the state changes. 
     function() { 
      if(http.readyState == 4 && http.status == 200) { 
       doSomethingWithMyData(http.reponse); 
      } 
     } 
    } 
    http.send(parameters); 
} 

:

davranışı daha böyle bir şey için kodunuzu değişti eğer ne beklediğini gibi olurdu modu. http.send() hemen döndürür. Kodunuzu Asynch to False ile deneyebilirsiniz.

var b; 
function Transport(parameters,Page) { 
var http = new XMLHttpRequest(); 
http.open("POST", "http://***.***.***.***/"+Page, false); 

    //Send the proper header information along with the request 
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    http.setRequestHeader("Content-length", parameters.length); 
    http.send(parameters); 
    b=http.response; 
    return b; 
} 

Daha fazla bilgi için lütfen http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp'a bakın.

0

() isteği göndermek için, b zaten var ve değer undefined sahiptir. Arama eşzamansızdır ve bu nedenle isteğin tamamlanmasını beklemeden hemen döner. İstek hala arka planda işleniyor ve düğmeye ikinci kez basmanızla tamamlandı. Tamamlandığında, 2. çağrıyla döndürülen b'yi ayarlar. Eğer Asenkron HttpRequest kullanmaya çalışıyorsanız

var transaction = Transport(parameters,"/mypage.php"); 
+0

Teşekkür ama Bu gerçekten benim sorunumu çözmez, çünkü geri döndürülmüş verileri manipüle etmem gereken bir örnek vardır, sadece bir uyarı olarak göstermez. İşlevimi, verileri işleyen işlevin geri kalanıyla ayırmak istiyorum. –

+0

@Alfred Alfizo Mosima Bütün örneğiniz, verileri bir uyarıya koyuyor. Daha fazla ekleyeceğim, böylece nasıl değiştirileceğini görebilirsiniz. – Tibrogargan

2

Bir asenkron isteği yapan ancak sonuç eşzamanlı işlemek için çalışıyoruz. Bunun yerine, bir geri arama kullanın.

function transport(parameters, Page, callback) { // not a constructor, cammel case 
    var xhr = new XMLHttpRequest(); 

    xhr.open("POST", "http://***.***.***.***/" + Page); 

    //Send the proper header information along with the request 
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    // don't set content-length, you'll get a warning 

    xhr.addEventListener('load', function() { 
     callback(this.response, this); 
    }); 
    xhr.send(parameters); 
    return xhr; 
} 

Sonra bir Promise

/** 
* Fetches a resource using XMLHttpRequest and a Promise 
* @param {String} url - The URL of the resource to get 
* @param {String|FormData|Blob|File} [postData] - Any data to POST 
* @param {String} [responseType] - The type of response to expect (defaults to document) 
* @returns {Promise} 
*/ 
function fetch(url, postData, responseType) { 
    return new Promise((res, rej) => { 
     var x = new XMLHttpRequest(); 
     x.responseType = responseType || 'document'; 
     x.addEventListener('load', e => res(x.response, x)); 
     x.addEventListener('error', e => { 
      console.warn('XHR Error', url, e); 
      rej(x.response, x); 
     }); 
     if (!postData) { 
      x.open('GET', url); 
      x.send(); 
     } else { 
      x.open('POST', url); 
      if ('string' === typeof postData) 
       x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
      x.send(postData); 
     } 
    }); 
} 

olarak bu yazabiliriz ES6 yılında

transport(
    parameters, 
    "/mypage.php", 
    function (response) {alert(response);} 
); 

Sonra

fetch(Page, parameters, 'text').then(alert);