3

我的 JavaScript 代码 -

function updateWhatIfPrivacyLevelRemove(recordId, correspondingDetailIDs) {
    var ajaxCall = $.ajax({ data: { Svc: cntnrRoot,
        Cmd: 'updateWhatIfPrivacyLevel',
        updatePrivacyAction: 'Remove',
        recordID: recordID
        },
        dataType: "text",
        context: this,
        cache: false
    });

    $.when(ajaxCall).then(updateWhatIfPrivacyLevelRemoveSuccess(recordID, correspondingResidentDetailIDs));
}

function updateWhatIfPrivacyLevelRemoveSuccess(recordID, correspondingResidentDetailIDs) {
    //several other lines of non-related code
            $.ajax({ data: { Svc: cntnrRoot,
                Cmd: 'handleResidentRow',
                recordID: 1,
                active: 0
            },
                dataType: "text",
                context: this,
                cache: false
            });
}

在我的 C# 代码中,我处理“updateWhatIfPrivacyLevel”和“handleResidentRow”的回调。我可以看出,handleResidnetRow 的 AJAX 回调是在 updateWhatIfPrivacyLevel 之前调用的。

为什么?

4

1 回答 1

2

当您尝试设置回调时,您实际上是在调用该函数。换句话说,您没有将“updateWhatIf...”函数作为回调传递,而是传递了它的返回值(看起来总是如此undefined)。

试试这个:

$.when(ajaxCall).then(function() {
  updateWhatIfPrivacyLevelRemoveSuccess(recordID, correspondingResidentDetailIDs);
});

对函数名的引用是对作为对象的函数的引用,可用于将函数作为回调传递。但是,对函数的引用( )是对该函数的调用,该函数将被评估,以便可以在周围表达式的上下文中使用返回值。因此,在您的代码中,您将undefined(函数调用的结果)传递给.then()方法,这当然不会做您想要的。

重要的是要记住 jQuery 只是 JavaScript,尤其是 JavaScript 函数库。尽管这个.then()东西看起来像一个语言结构,但它不是——JavaScript 解释器不会以任何方式特别对待它。

在我的建议中使用匿名函数的另一种.bind()方法是在较新的浏览器中使用函数原型上的方法。这基本上为您做同样的事情,但它在风格上更像传统的函数式编程。

于 2012-07-29T16:41:41.940 回答