我正在使用 Deferred.Done 方法,它再次被另一个 jquery 函数调用,
但即使是点 (a) {return false},它仍然会到达点 (b),
我在这里做什么?..
function InitialMethod(isInitialCallToMethod) {
//Call using deferred method
CheckUserSession()
.done(function (isSessionAvailable) {
//Session data exists for end user.
if (!isSessionAvailable) {
//reopen modal to get user details
OpenUserSessionModal();
return false; --(a)
}
})
.fail(function (error) {
//reopen modal to get user details
OpenUserSessionModal();
//open failure div to notify user
OpenJqueryPopup('#divDialogFailure');
return false;
});
//Is method called for the first time,after document load?
if (isInitialCallToMethod) {
//bind elearning tabs
CreateElearningTabs();
}
return true; ---(b)
}
最佳答案
需要理解的三件事:
- 两个
return false
代码中的语句都从各自的.done()
返回和.fail()
处理程序,而不是来自外部函数。 - 从 jQuery 的
.done()
返回任何内容和.fail()
毫无意义。无论返回什么,这两种方法都保证不改变地传递它们的输入 promise 。只有 jQuery 的.then()
有能力“过滤”——即传递新的 promise 。 - 将 jQuery promise 链从其成功路径转移到错误路径的唯一方法是返回被拒绝的 promise 。返回
false
,甚至来自.then()
处理程序不会产生相同的效果。
我猜你想调用 CreateElearningTabs()
仅当isSessionAvailable
是真实的并且isInitialCallToMethod
是真实的,在这种情况下:
function InitialMethod(isInitialCallToMethod) {
return CheckUserSession().then(function (isSessionAvailable) {
if (isSessionAvailable) {
if (isInitialCallToMethod) {
CreateElearningTabs();
}
} else {
OpenUserSessionModal();
return $.Deferred().reject(new Error('session not available')).promise();
}
}, function (error) {
OpenUserSessionModal();
OpenJqueryPopup('#divDialogFailure');
return error;
);
}
你可以想办法避免重复语句 OpenUserSessionModal()
(例如,错误处理程序可以测试 error
)但这不是什么大问题。
返回来自 InitialMethod()
的 promise ,结果将提供给调用者。
关于javascript - 在 deferred.done 中返回,不从函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31786775/