如何处理长期请求?

时间:2016-09-27 22:06:22

标签: javascript ajax browser notifications timeout

我有一个ajax请求可能需要很长时间才能返回响应。

tt_content.image.20.1 {
  file.width.override {
    override = 200c
    override.if {
      equals.field = layout
      value = 1
    }
  }
}

如果请求需要几分钟,那么一切都按预期工作。但如果响应时间超过10分钟;我收到以下错误:

#does not work    
tt_content.image.20.1.file.width = CASE
tt_content.image.20.1.file.width {
    key.field = layout
    1 = TEXT
    1.value = 200c
    2 = TEXT
    2.value = 400c
}

但是在服务器上,我仍然可以看到我的请求正在处理中。完成该过程后,我可以看到它发送 $.ajax({ type: 'POST', url: 'some_url', data: data, processData: false, contentType: false, headers: { "Authorization": 'Token token="'+some_token+'"' } }).then(function(){ do_something(); }); 响应。但我相信,自从遇到错误以来,没有人听取回应。

我想让用户知道该过程已经完成。

有没有人知道处理此问题的“最佳做法”?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

由于Ajax是同步的,我喜欢申请承诺。从我的头脑中,我相信这就像下面这样:

function send_ajax(url, data, some_token) {
    var ajax = $.ajax({
        type : 'POST',
        url : url,
        data : data,
        processData : false,
        contentType : false,
        headers : {
            "Authorization" : 'Token token="' + some_token + '"'
        }
    })

    return ajax.promise();
}


send_ajax("url","data","some_token").done(function(result) {
    console.log(result);
    do_something();
});

结果是承诺的,当返回执行完成后的函数。 10分钟似乎确实很长时间。

编辑:不是解决方案 正如我所指出的那样,原始的Ajax调用仍然在其上下文中。意味着then()方法将处理返回的调用。我选择的解决方案不适用于OP问题。 作为参考,当ajax逻辑放在其自己的函数中并且返回值时,选择的解决方案确实处理异步障碍。