【问题标题】:Accessing ioArgs from callback functions从回调函数访问 ioArgs
【发布时间】:2012-11-15 07:23:54
【问题描述】:

我正在将一堆旧道场升级到 1.8。对于我们的 ajax 请求处理,我们有一个装饰器(嗯,函数包装器),它将在某些情况下根据响应内容执行重定向,例如:

// 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
    })
});

现在,在 dojo 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。检查延迟(通过中断链接)似乎也不起作用,并且需要比我想要的更多的重新设计。

有什么想法吗?


感谢 Ken(也感谢您在 #dojo 的帮助)。详细地说,解决方案是使用 dojo/request 并改用 .response 延迟承诺,它提供了必要的信息:

// 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
}));

【问题讨论】:

    标签: dojo


    【解决方案1】:

    dojo/request 返回的承诺实际上是带有额外response 承诺的对象,可提供更多信息。有关信息,请参见以下位置:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多