2012-11-14 39 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 
})); 

回答