【问题标题】:$.ajax promises 'then' not chaining as i expect$.ajax 承诺“然后”不会像我期望的那样链接
【发布时间】:2014-10-17 20:15:36
【问题描述】:

下面是我的代码。第一个控制台消息显示结果,第二个没有...这不是神奇地违背承诺...这怎么可能?

    this.saveAsTemplate = function(name, asNew) {
        return _saveSet(name, asNew)
            .then(function(result) {
                // -> result is set correctly
                console.log('oh but youll ****ing work... wth?', result);
                $.ajax({
                    url: '/rest/filter/template/'+result.id,
                    type: 'PUT',
                }).success(function(result) {
                    console.log('successfully saved template, result: ', result);
                });
            })
            .then(function(result) {
                // -> result is undefined :(
                console.log('no ****ing result: ', result);
            });

在过去的几个月里,我不得不编写额外的 deferreds 来解决这个问题……这真的把我的代码弄乱了。非常感谢您的帮助!

编辑:可以在这个问题中找到正确链接承诺的一个很好的清晰示例解决方案:(注意所有函数返回) How do I chain three asynchronous calls using jQuery promises?

【问题讨论】:

  • 您应该将.success 替换为.done.success 已弃用。 (不要与success:fn 混淆)
  • 您的代码已损坏。为什么人们认为问题总是出在由一群知道自己在做什么的专业人士组成的庞大社区编写的外部库上,而不是出在他们自己只有一个人看过的有缺陷的代码上?不,您还没有在 jQuery 中发现错误。您在自己的代码中编写了一个错误。
  • 哇,我在他的问题中没有看到任何暗示他在指责外部库的内容。
  • 你很容易微薄,我不怀疑我误解了 jquery ajax 承诺的工作方式。我正在寻找帮助我理解我做错了什么的人。凯文,感谢您的提醒(虽然代码现在可以工作,但我想它会在未来的版本中中断,所以为解决可能会在 2015 年出现的错误而欢呼=P)。

标签: jquery jquery-deferred


【解决方案1】:

要以这种方式链接.then,您必须向它返回一个承诺。

return $.ajax({

完整样本:

this.saveAsTemplate = function(name, asNew) {
    return _saveSet(name, asNew).then(function(result) {
        console.log('oh but youll ****ing work... wth?', result);
        // *** The following line was modified ***
        return $.ajax({
            url: '/rest/filter/template/'+result.id,
            type: 'PUT',
        }).done/*success*/(function(result) {
            console.log('successfully saved template, result: ', result);
        });
    }).then(function(result) {
        console.log('no ****ing result: ', result);
    });

【讨论】:

  • 我的代码应该更清楚一点。看到这个函数肯定会返回一个 promise,因为第一个 then 有效。我将在我的问题中编辑我的代码以使其更清晰。
  • 嗯...你问题中的那个没有返回承诺,我所做的修改纠正了这个问题。
  • 在您传递给.then() 的第一个回调中,您没有返回承诺。在我的代码中,我正在返回一个承诺。这就是区别。为清楚起见添加了注释。
  • 哦,伙计,那么您在第一个返回的内容,然后作为数据提供给第二个?
  • 正确。例如,你可以return "Hello World",这就是你接下来会得到的。
猜你喜欢
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
  • 2018-03-12
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多