2015-08-03 163 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

現在,我處於兩難境地,回答標記爲已接受,兩個回答我的查詢以不同的方式 –