jQuery延迟对象和回调

时间:2013-05-22 21:41:34

标签: jquery callback deferred

我有以下简化代码:

$.when(someClass.MethodWithXhrCall(args, callBack, errCallBack))
.then(function () {
        console.log('Yep');
    }
})
.fail(function () {
    console.log('Nope');
});

function callBack(data) {
    // Yes I got my data
    var x=data.CustomerName;
    .....
}

function errCallBack(data) {
    alert (data.ErrorText);
}

未调用回调。但是,当我不使用延迟构造时,回调按预期工作。当然,我遇到了其他时间问题,我试图避免使用延迟构造。

* 于2013年5月23日更新[已解决] * 我终于能够做我正在寻找的事情了。我的回调是获取响应对象,延迟对象阻止执行代码直到调用完成。

以下是代码:

// Define this as a global variable
var _eipDfd = null; // Will be used to create the deferred object

// Call the webservice to read this customer's data
console.log("Reading existing customer data");
function asyncEvent() {
    _eipDfd = new jQuery.Deferred();
    someClass.GetCustomer(args, processReadCust, errCallBack);
    return _eipDfd.promise();
}
$.when(asyncEvent()).then(
    function (status) {
        console.log(status); // Will print Success!!
    },
    function (status) {
        console.log(status); // Will print Failed :(
    }    
);    
console.log("Web service call is done");
......

// Callback functions are still being called from someClass.GetCustomer with the response object being pass to them
processReadCust: function (data) {
    // Do the work


    _eipDfd.resolve("Success!!");
    return;
}    

errCallBack: function (data) {
    // Take care of failure

    _eipDfd.reject("Failed :(");
    return;     
}

1 个答案:

答案 0 :(得分:0)

你很幸运,jQuery的人员正是为这种情况设计了jqXHR对象。

首先,从someClass.MethodWithXhrCall返回一个jqXHR对象,例如:

someClass.MethodWithXhrCall = function(...) {
    ...
    return $.ajax(...);
}

Ajax简写方法$.get()$.getJSON()$.getScript()$.post()也返回一个jqXHR对象。

现在,相同的参数将传递给callBack,因为它将传递给$.ajax成功函数。所以写下callBack如下:

function callBack(data, textStatus, jqXHR) {
    ...
}

同样,相同的参数将传递给errCallBack,因为它将被传递给$.ajax错误函数。所以写下errCallBack如下:

function errCallBack(jqXHR, textStatus, errorThrown) {
    ...
}

有关详细信息,请参阅jQuery.ajax()页面。

因此,服务器返回的所有内容都可用于这两个回调中的一个或另一个。

本地(因此私有)到someClass.MethodWithXhrCall的任何变量都不会自动可用于回调,但是可以通过更多的工作来传递它们。只在必要时担心这方面。