Javascript Return in deferred.done,不从函数返回

Javascript Return in deferred.done,不从函数返回,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,我使用的是Deferred.Done方法,它再次被另一个jquery函数调用 但即使点(a){return false}被击中,它仍然会到达点(b) 我在这里干什么 function InitialMethod(isInitialCallToMethod) { //Call using deferred method CheckUserSession() .done(function (isSessionAvailable) { //Session data ex

我使用的是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
语句。您可以从函数返回另一个承诺,如下所示:

function InitialMethod(isInitialCallToMethod) {

  // your main function's result
  var result = jQuery.Deferred();

  //Call using deferred method
  CheckUserSession()
      .done(function (isSessionAvailable) {

          //Session data exists for end user.
          if (!isSessionAvailable) {
              //reopen modal to get user details
              OpenUserSessionModal();
              // resolve to false
              result.resolve( false );
          }

          //Is method called for the first time,after document load?
          if (isInitialCallToMethod) {
              //bind elearning tabs
              CreateElearningTabs();
          }
          // resolve to true
          result.resolve( true );
      })
      .fail(function (error) {

           //reopen modal to get user details
           OpenUserSessionModal();

           //open failure div to notify user
           OpenJqueryPopup('#divDialogFailure');

           // resolve to false
           result.resolve( false );
  });

  // return a new promise
  return result.promise(); 
}
或者更紧凑一点

function InitialMethod(isInitialCallToMethod) {

  //Call using deferred method
  return CheckUserSession()
      .then(function (isSessionAvailable) {

          //Session data exists for end user.
          if (!isSessionAvailable) {
              //reopen modal to get user details
              OpenUserSessionModal();

              // resolve to false
              return false;
          }
          return true;
      }, function (error) {

           //reopen modal to get user details
           OpenUserSessionModal();

           //open failure div to notify user
           OpenJqueryPopup('#divDialogFailure');

           // resolve to false
           return false;

      })
      .then( function( ok ){
        if (ok && isInitialCallToMethod) {
            //bind elearning tabs
            CreateElearningTabs();
        }
        return ok;
      });
}

请注意,在这两种情况下,结果都不是布尔值,而是承诺

您不能简单地从回调函数返回,并期望原始范围像它自己的那样尊重
return
语句。您可以从函数返回另一个承诺,如下所示:

function InitialMethod(isInitialCallToMethod) {

  // your main function's result
  var result = jQuery.Deferred();

  //Call using deferred method
  CheckUserSession()
      .done(function (isSessionAvailable) {

          //Session data exists for end user.
          if (!isSessionAvailable) {
              //reopen modal to get user details
              OpenUserSessionModal();
              // resolve to false
              result.resolve( false );
          }

          //Is method called for the first time,after document load?
          if (isInitialCallToMethod) {
              //bind elearning tabs
              CreateElearningTabs();
          }
          // resolve to true
          result.resolve( true );
      })
      .fail(function (error) {

           //reopen modal to get user details
           OpenUserSessionModal();

           //open failure div to notify user
           OpenJqueryPopup('#divDialogFailure');

           // resolve to false
           result.resolve( false );
  });

  // return a new promise
  return result.promise(); 
}
或者更紧凑一点

function InitialMethod(isInitialCallToMethod) {

  //Call using deferred method
  return CheckUserSession()
      .then(function (isSessionAvailable) {

          //Session data exists for end user.
          if (!isSessionAvailable) {
              //reopen modal to get user details
              OpenUserSessionModal();

              // resolve to false
              return false;
          }
          return true;
      }, function (error) {

           //reopen modal to get user details
           OpenUserSessionModal();

           //open failure div to notify user
           OpenJqueryPopup('#divDialogFailure');

           // resolve to false
           return false;

      })
      .then( function( ok ){
        if (ok && isInitialCallToMethod) {
            //bind elearning tabs
            CreateElearningTabs();
        }
        return ok;
      });
}

请注意,在这两种情况下,结果都不是布尔值,而是承诺

需要了解三件事:

  • 代码中的两个
    return false
    语句都从各自的
    .done()
    .fail()
    处理程序返回,而不是从外部函数返回
  • 从jQuery的
    .done()
    .fail()
    返回任何内容都是毫无意义的。无论返回什么,这两种方法都保证不改变其输入承诺。只有jQuery的
    .then()
    具有“过滤”功能,即传递新的承诺
  • 将jQuery承诺链从其成功路径转移到错误路径的唯一方法是返回被拒绝的承诺。返回
    false
    ,即使是从
    。then()
    处理程序返回,也不会产生相同的效果
我猜只有当
isSessionAvailable
为真且
isInitialCallToMethod
为真时,您才会调用
CreateLearningTabs()
,在这种情况下:

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()
(例如,错误处理程序可以测试
错误
),但这不是什么大问题


通过从
InitialMethod()
返回承诺,调用者可以获得结果。

需要了解三件事:

  • 代码中的两个
    return false
    语句都从各自的
    .done()
    .fail()
    处理程序返回,而不是从外部函数返回
  • 从jQuery的
    .done()
    .fail()
    返回任何内容都是毫无意义的。无论返回什么,这两种方法都保证不改变其输入承诺。只有jQuery的
    .then()
    具有“过滤”功能,即传递新的承诺
  • 将jQuery承诺链从其成功路径转移到错误路径的唯一方法是返回被拒绝的承诺。返回
    false
    ,即使是从
    。then()
    处理程序返回,也不会产生相同的效果
我猜只有当
isSessionAvailable
为真且
isInitialCallToMethod
为真时,您才会调用
CreateLearningTabs()
,在这种情况下:

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()
(例如,错误处理程序可以测试
错误
),但这不是什么大问题


通过从
InitialMethod()
返回承诺,调用者可以获得结果。

为什么不可以?您从回调中返回一个值,该值不是函数
createElearningTabs()
。没有在@Sirko获取它。。我已经从。完成事件返回false。。。!!为什么不呢?您从回调中返回一个值,该值不是函数
createElearningTabs()
。没有在@Sirko获取它。。我已经从。完成事件返回false。。。!!现在,我左右为难,哪一个答案被标记为已接受,都以不同的方式回答了我的问题如果有帮助,这两个解决方案在如何向调用者报告结果方面是不同的。Sirko:A
CheckUserSession()
错误将导致返回的承诺采用错误路径,但“会话不可用”将使其采用成功路径。Roamer:A
CheckUserSession()
错误和“会话不可用”都将导致返回的承诺采用错误路径。这对你来说可能无关紧要,但如果是的话,这就是两个答案之间的主要区别。现在,我陷入了两难境地,哪一个答案被标记为已接受,两个答案都以不同的方式回答了我的问题。如果有帮助,两个解决方案在向来电者报告结果的方式上是不同的。Sirko:A
CheckUserSession()
错误将导致返回的承诺采用错误路径,但“会话不可用”将使其采用成功路径。Roamer:A
CheckUserSession()
错误和“会话不可用”都将导致返回的承诺采用错误路径。这对你来说可能无关紧要,但如果是的话,那就是这两个答案之间的主要区别。现在,我陷入困境,哪一个答案被马克接受,都以不同的方式回答了我的问题。雪,我陷入困境,哪一个答案被马克接受,都以不同的方式回答了我的问题