2012-11-14 89 views
0

我正在將一堆舊dojo升級到1.8。對於我們的AJAX請求處理,我們已經有了一個裝飾(當然,函數包裝),將執行基於響應內容某些情況下重定向,例如:現在從回調函數訪問ioArgs

// Decorator func: 
var redirectDecorator = function(func) { 
    var f = function(data, ioArgs) { 
     if(data.redirect) { 
      // A manual location redirect: 
      window.location.href = data.redirect; 
     if(data.redirect_xhr) { 
      // clone ioArgs, spawn new request to follow redirect etc 
      // <snip> 
     } else { 
      func(response); 
     } 
    } 
    return f; 
} 

// Used like so: 

dojo.xhrPost({ 
    url: url 
    handleAs: "json", 
    form: form, 
    load: redirectDecorator(function(data, ioArgs) { 
     // do stuff 
    }) 
}); 

,在道場1.8(該dojo/request/xhr模塊) xhr()返回一個Deferred鏈接和回調只提供data參數(沒有ioArgs - 顯然這些都附加到諾言 - 見http://bugs.dojotoolkit.org/ticket/12126)。

換言之,上述的AJAX調用變爲:

xhr.post(url, { 
    handleAs: "json", 
    form: form 
}).then(function(data) { 
    // do stuff 
}); 

問題是,我不能再包裹匿名功能,因爲ioArgs不提供。檢查延期(通過打破鏈接)似乎也不工作,並需要更多的重新設計比我想。

任何想法?


謝謝肯(在#dojo也有幫助)。爲了詳細說明,該解決方案是使用dojo/request和使用.response遞延承諾相反,它提供了必要的信息:從dojo/request返回

// Decorator func: 
var redirectDecorator = function(func) { 
    var f = function(response) { 
     var data = response.data; 
     if(data.redirect) { 
      // A manual location redirect: 
      window.location.href = data.redirect; 
     if(data.redirect_xhr) { 
      request(data.redirect_xhr, response.options).then(func); 
     } // more conditions follow. 
    } 
    return f; 
} 

request.post(url, { 
    handleAs: "json", 
    form: form 
}).response.then(redirectDecorator(function(response) { // <-- note .response.then(
    // do stuff where data is response.data 
})); 

回答