javascript - 在 deferred.done 中返回,不从函数返回

标签 javascript jquery jquery-deferred

我正在使用 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/

相关文章:

javascript - jQuery 插件 - 奇怪的点击行为

javascript - 打开自定义模式窗口时如何添加过渡效果?

使用 knockout 时,jquery 单击事件不会触发

javascript - 在这种情况下如何正确利用 $.Deferred()/Promise() ?

javascript - 对象传播符号如何转换 react redux Prop ?

javascript - 根据选择的单选按钮更改按钮链接

javascript - 无法将图像附件发送到后端

javascript - Lightbox CSS/JS 画廊集成到 WordPress 图像上传

angularjs - Angular JS 中未调用 Promise 回调

javascript - 发送异步请求时检测变量何时 != undefined 的更好方法