2015-06-01 121 views
0

所以我知道有大量關於AJAX和使用上下文的線程,但經過幾個小時的閱讀和嘗試,我打開一個新的線程。在AJAX調用中使用「context:...」的正確方法是什麼?

所以我有這個(縮短版)JavaScript函數:

this.CallService = function() { 
    var Type = this.Type; 
    var Url = this.Url; 
    var Data = this.Data; 
    var ContentType = this.ContentType; 
    var DataType = this.DataType; 
    var ProcessData = this.ProcessData; 

    var ClipUrl = this.ClipUrl; 
    var CountMax = this.CountMax; 
    var Callback = this.Callback; 

    var SucceededServiceCallback = this.SucceededServiceCallback; 
    var FailedServiceCallback = this.FailedServiceCallback; 


    return $.ajax({ 
     type: Type, //GET or POST or PUT or DELETE verb 
     url: Url, // Location of the service 
     data: Data, //Data sent to server 
     contentType: ContentType, // content type sent to server 
     dataType: DataType, //Expected data format from server 
     processdata: ProcessData, //True or False 
     context: this, 
    }).done(function (msg) {//On Successfull service call 
     SucceededServiceCallback(this, msg); 
    }).fail(function (msg) { 
     FailedServiceCallback(this, msg); 
    }); 
} 

這裏的重要組成部分,是context: this和兩個回調donefail。 IM這兩個回調我給this背景下我的回調函數:

this.SucceededServiceCallback = function (context, result) { 
    if (null != context) { 
     UpdateDebugInfo(context, "succeeded: " + context.DataType + " URL: " + context.Url + " Data: " + context.Data + " Result: " +result); 
    } 
    if (context != null && context.DataType == "json" && result != null && context.Callback != null) { 
     context.Callback(context, result); 
    } 
} 

在這裏,重要的是,我使用上下文看訪問的變量數據類型,回調,URL等
現在的問題是,上下文被設置爲最後使用的上下文(這是一個異步調用,所以所有變量都是上次調用的變量)。 所以我很確定那個context: this,部分有問題。我只是不知道如何使用這個權利。謝謝你的幫助。

tl; dr:
在Ajax調用中使用context: this。上下文總是被設置爲最後的「this」。我想用這個電話的「這個」。

+1

如果我理解你的問題,請嘗試:'背景:$ .extend({} ,這個),' –

+1

@ A.Wolff將克隆他的整個對象,這可能是矯枉過正,可能會引入其他問題(例如:假設他們以後是同一個對象)。最好只是創建一個包含OP感興趣的字段的對象。 –

+0

@AlexMcMillan我很同意。你的回答確實很乾淨 –

回答

2

您是「緩衝」所有的變量,你開火之前每個請求,但在你的SucceededServiceCallback功能您正在檢查this.XXX - 這是不是它看起來像你期待的var Type,但實際this.Type本身。

你可以做的是把這些特性爲對象,並把它作爲背景,而不是你的主要目標:

this.CallService = function() { 
    var context = { 
     Type : this.Type, 
     Url : this.Url, 
     Data : this.Data, 
     ContentType : this.ContentType, 
     DataType : this.DataType, 
     ProcessData : this.ProcessData, 
     ClipUrl : this.ClipUrl, 
     CountMax : this.CountMax, 
     Callback : this.Callback 
    }; 

    var SucceededServiceCallback = this.SucceededServiceCallback; 
    var FailedServiceCallback = this.FailedServiceCallback; 

    return $.ajax({ 
     type: Type, //GET or POST or PUT or DELETE verb 
     url: Url, // Location of the service 
     data: Data, //Data sent to server 
     contentType: ContentType, // content type sent to server 
     dataType: DataType, //Expected data format from server 
     processdata: ProcessData, //True or False 
     context: context, 
    }).done(function (msg) {//On Successfull service call 
     SucceededServiceCallback(this, msg); 
    }).fail(function (msg) { 
     FailedServiceCallback(this, msg); 
    }); 
} 
+0

所以這個版本工作得很好,非常感謝你@Alex McMillan – Neifen

相關問題