多次呼叫同一非同步方法體會出現使用相同的屬性值問題
《一》執行同一個方法體,裡面有非同步的邏輯程式碼,如果這個非同步請求還沒有執行完畢時,我們又對它進行了第二次呼叫,它會使用最後一次的執行操作。例如:
var test = {
init:function(){
this.temp = "temp" + new Date().getTime();
console.log(this.temp );
self = this;
this[this.temp] = function(){
setTimeout(function(){
console.log(this.temp);
},3000)
}
},
excute:function(){
this[this.temp]();
}
};
第一次執行:
test.init();
test.excute();
第二次執行:
test.init();
test.excute();
在兩次init時輸出的 temp是各不相同 。
但我們在非同步函式體輸出的卻是相同的,也即是第二次執行的被第一次的給覆蓋掉了 。這和我們理想中的狀態差別不是一般的大。在很多應用場景當中,比如說我們做了一個非同步請求,還沒有來得非同步資料處理完畢,我們又進行了第二次操作。 就會出現處理資料混亂。
《二》有沒有解決辦法呢:請看下面的程式碼:
var test = {
init:function(){
this.temp = "temp" + new Date().getTime();
console.log(this.temp);
self = this;
this[this.temp] = (function(){
var bb = self.temp;
return function(){
setTimeout(function(){
console.log(bb);
},3000)
}
})();
},
excute:function(){
this[this.temp]();
}
};
test.init();
test.excute();
這個也就是在非同步包含體給加了一個閉包,把所要傳的值放在臨時變數中,這樣就解決了重複呼叫最後的屬性值了。