$。推迟不推迟

时间:2014-03-18 12:10:55

标签: jquery asynchronous

当我在调试器中单步执行mys代码时,我可以看到var answer给出了我的期望但是当函数完成时它显示为undefined。有人可以请我指出正确的方向吗?我已经阅读了文档,无法查看我出错的地方。代码如下:

function hasTimeAccountData(aktivEmployee) {
        this.aktivEmployee = aktivEmployee;
        var deferred = new $.Deferred();
        callService("GetEmployee",
            { employeeNo: aktivEmployee.id},
            function (result) {
                var answer = result.HasTimeAccountData;
                deferred.resolve(answer);
            });
        return deferred.promise();
    }

function callService(functionName, data, onSuccess, onTimeout) {
    var timeout;
    if (onTimeout) timeout = setTimeout(onTimeout, 10000);
    var server = lStorage.getServerUrl();
    if (!server) server = getDefaultAddress();
    var url = server + functionName;
    $.ajax({
        dataType: "jsonp",
        url: url,
        data: data,
        success: function (data) {
            clearTimeout(timeout);
            if (onSuccess) onSuccess(data);
        }
    });
}

提前致谢

1 个答案:

答案 0 :(得分:3)

我认为重要的是要记住hasTimeAccountData正在返回一个承诺,所以不能立即评估它会期望它将返回该承诺的成功结果。因此,您在评论中(hasTimeAccountData(employee)===false)中包含的代码无法使用。

您需要使用promise对象的方法并引入将响应该promise的不同结果的回调。即

hasTimeAccountData(employee)
        .then(showEmployeeData, showErrorMessage);

Here is a detailed test case fiddle我已经把它放在一起,表明你可以回应承诺的不同结果。我已经扩展hasTimeAccountData以便在出现问题时调用承诺拒绝...

function hasTimeAccountData(aktivEmployee) {
    var deferred = new $.Deferred();    

    this.aktivEmployee = aktivEmployee;

    callService(
        "GetEmployee", 
        { employeeNo: aktivEmployee.id },
        function success(result) {
            if (result.hasOwnProperty("HasTimeAccountData")) {
                deferred.resolve(result.HasTimeAccountData);
            }
            else {
                deferred.reject("no time account data field in return data!");
            }
        },
        function timeout() {
            deferred.reject("timeout occurred");
        }
    );

    return deferred.promise();
}

我嘲笑了callService方法来说明这一点。

我希望这有帮助,如果不查看jQuery docs on this,他们真的很好。