【问题标题】:Unable to successfully reject chained AJAX call?无法成功拒绝链式 AJAX 调用?
【发布时间】:2017-12-06 06:50:19
【问题描述】:

我有一个简单的 JQuery 事件处理程序,它在提交表单时触发。

$('.selector').on('submit', function(e) {
    e.preventDefault();

    submitForm(status).then(updateData());
});

如果第一个呼叫满足特定条件,我正在尝试添加取消第二个呼叫的功能,但我无法使其正常工作。我发现了这个问题,但由于某种原因,当返回 reject() 时,第二个函数仍然执行。 Rejecting A jQuery Promise In A $.ajax Success Method.

function submitForm(status) {
    return $.ajax({
        method: "POST",
        url: "/url/to/use",
        data: formData,
        dataType: "json",
        contentType: false,
        processData: false
    }).then(function(data) {
        if (data.error === true) {
            return new $.Deferred().reject().promise();
        } else {
            // do other stuff
        }
    });
}

我是否需要创建一个延迟对象并将其返回,还是仅通过调用then() 来完成?我已经阅读了很多关于 deferred 和 promises 的内容,但仍然无法理解它们是如何工作的。

【问题讨论】:

  • 你运行的是什么版本的jQuery? jQuery 3.x 的行为与 1.x/2.x 略有不同。
  • 呃,submitForm(status).then(updateData()); 应该是 submitForm(status).then(updateData);。你的第一个总是调用updateData() 并将返回结果作为.then() 处理程序传递,甚至在promise 调用.then() 处理程序之前。
  • 它是 JQuery 1.12.4。

标签: jquery ajax promise jquery-deferred


【解决方案1】:

我需要创建一个延迟对象并返回它,还是只通过调用 then() 来完成?我已经阅读了很多关于 deferred 和 promises 的内容,但仍然无法理解它们是如何工作的。

这是 jQuery throw 发出错误信号。

如前所述,在提交表单后,您的代码实际上并没有调用updateData,您需要向它传递一个函数并且向它传递一个承诺。更好的 promise 库(如 bluebird)或类型检查器(如 TypeScript)会告诉你:)

submitForm(status).then(updateData); // pass the function, don't invoke

【讨论】:

  • 它正在调用updateData,问题是我无法在需要时中断它。我已按照您的建议对其进行了更改,但现在根本没有调用它。
  • 感谢您的推荐,但我决定摆脱 then 并在成功回调中调用 updateData
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多