2017-06-24 86 views
2

我有一個簡單的get函數使用XMLHttpRequest它接受回調參數。計劃是調用onload事件處理程序的回調。XMLHttpRequest和綁定回調不起作用

下面是一個簡化的版本:

get(url,doit); 

function doit(data) { 
    alert(data) 
} 
function post(url,callback) { 
    var xhr=new XMLHttpRequest(); 
    xhr.onload=function() {      // Version 1 
     callback(xhr.response) 
    } 
    xhr.onload=callback.bind(xhr,xhr.response); // Version 2 
    xhr.open('get',url,true); 
    xhr.send(data); 
} 

回調函數有一個參數,其中data應該是從AJAX調用的響應。

我有2個版本調用回調的:

  1. 1版只是調用事件處理函數裏面回調。
  2. 版本2使用bind來做同樣的事情; this設置爲xhr對象,而xhr.response作爲參數發送。

當我使用版本1時,一切都按預期工作。當我使用版本2時,data參數爲空。

我以爲我知道XMLHttpRequest.bind()相當不錯,但我不知道爲什麼第二個版本是空的。什麼是(不)發生在這裏?

評論

感謝的答案,我想我有它。

.bind()與的xhr.responseText當前值,其中,在這個階段,沒有什麼立即執行。

看來,如果我需要回應一個未來價值的第一個版本是可取的。

謝謝大家。

+1

當執行'.bind(XHR,xhr.response)'沒有任何響應尚未 - >'xhr.response === undefined' – Andreas

回答

1

這是因爲callback.bind將立即執行。在執行時,由於請求尚未完成,因此xhr.responseText顯然不可用。你可以試試看看結果。

function doit(data) { 
    alert(data, this.responseText); 
} 
0

這是bind行爲:參數綁定的情況下,綁定值是被引用的對象,或在該時刻的原始值。

下面是一個簡單的代碼片斷:

function operate(callback) { 
    let a = { 
    display: 'AAA' 
    }; 
    setTimeout(callback.bind('ThisObj', a.display), 1000); 
    a.display = 'AAA222'; 
} 

operate(function(data) { 
    console.log(data); 
}); 

打印結果是:AAA,如a.display被綁定和a.display是基本類型(字符串) - 在綁定力矩的值(AAA)是通過。

這就是xhr.response所發生的情況,因爲它的類型是String。


然而,如果對象被結合作爲參數,該對象的引用將被傳遞,這意味着綁定函數將得到的最新值:

function operate(callback) { 
    let tmp = { 
    t: 'AAA' 
    }; 
    let a = { 
    display: tmp 
    }; 
    setTimeout(callback.bind('ThisObj', a.display), 1000); 
    tmp.t = 'AAA222'; 
} 

operate(function(data) { 
    console.log(data); 
}); 

打印結果是:{ t: 'AAA222' }

請注意:如果上述示例中的變量a將其值更改爲另一個對象,則綁定的參考值不會更改(仍然是上一個引用的對象):

function operate(callback) { 
    let a = { 
    display: 'AAA' 
    }; 
    setTimeout(callback.bind('ThisObj', a), 1000); 
    a = { 
    display: 'AAA222' 
    }; 
} 

operate(function(data) { 
    console.log(data); 
}); 

打印結果是:{ display: 'AAA' }