1. 程式人生 > >多次呼叫同一非同步方法體會出現使用相同的屬性值問題

多次呼叫同一非同步方法體會出現使用相同的屬性值問題

《一》執行同一個方法體,裡面有非同步的邏輯程式碼,如果這個非同步請求還沒有執行完畢時,我們又對它進行了第二次呼叫,它會使用最後一次的執行操作。例如:

 

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();

 

 

這個也就是在非同步包含體給加了一個閉包,把所要傳的值放在臨時變數中,這樣就解決了重複呼叫最後的屬性值了。