2015-08-03 121 views
1

我正在使用Deferred.Done方法,它又被另一个jQuery函数调用,返回deferred.done,不从函数返回

但即使点(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) 
} 
+0

为什么不应该这样?你从回调中返回一个值,而不是'createElearningTabs()'函数。 – Sirko

+0

没有得到它@Sirko ..我已经从.Done事件返回false! –

回答

3

三件事明白:

  • 代码两个return false语句都返回从各自.done().fail()处理程序,而不是从外部函数。
  • 从jQuery的.done().fail()返回任何东西都是毫无意义的。无论返回的是什么,这两种方法都保证不改变其输入诺言。只有jQuery的.then()有能力“过滤” - 即传递一个新的承诺。
  • 将jQuery承诺链从其成功路径转移到错误路径的唯一方法是返回被拒绝的承诺。返回false,即使从.then()处理函数也不会有相同的效果。

我猜你想打电话CreateElearningTabs()只有isSessionAvailable是truthy和isInitialCallToMethod是truthy,在这种情况下:

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()的承诺,结果可供调用者使用。

+0

谢谢!!,它现在清楚我误解了什么...... –

+0

现在,我处于两难境地,回答标记为已接受,都以不同方式回答了我的查询。 –

+0

如果有帮助,这两种解决方案在向调用者报告结果方面有所不同。 Sirko:一个'CheckUserSession()'错误将导致返回的承诺采取错误路径,但“会话不可用”将导致它采取成功路径。 Roamer:一个'CheckUserSession()'错误和“会话不可用”都会导致返回的promise承担错误路径。 它可能并不重要,但如果它确实如此,这是两个答案的主要区别。 –

3

你不能简单地从一个回调函数返回,并期望在原有范围,以尊重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; 
     }); 
} 

注意,在这两种情况下,结果是一个布尔值,而是一个承诺!

+0

谢谢!!,它现在清楚我误解了什么...... –

+0

现在,我处于两难境地,回答标记为已接受,两个回答我的查询以不同的方式 –