当我在调试器中单步执行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);
}
});
}
提前致谢
答案 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,他们真的很好。