2015-08-03 2 views
1

Я использую метод Deferred.Done, который снова называется другой функцией Jquery,Возвращение в deferred.done, не возвращается из функции

, но даже точки (а) {вернуться ложным}, ударен она по-прежнему идет в точке (б),

, что я здесь делаю? ..

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

Зачем это делать? Вы возвращаете значение из обратного вызова, который является _not_ функцией 'createElearningTabs()'. – Sirko

+0

не получил это @Sirko .. Я уже возвращаю false из .Done event ... !! –

ответ

3

Три вещи, чтобы понять:

  • Два return false заявления в коде и возвращаемое из соответствующих .done() и .fail() обработчиков, а не из внешней функции.
  • Возвращение чего-либо из .done() jQuery и .fail() бессмысленно. Гарантируется, что оба метода передадут свои обещания без изменений независимо от того, что возвращается. Только у .then() jQuery есть возможность «фильтровать», то есть передавать новое обещание.
  • Единственный способ сместить цепочку обещаний 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()' и недоступная для сеанса "будет заставлять возвращенное обещание принять путь ошибки. Возможно, это не имеет значения для вас, но если это так, это основное отличительное различие между двумя ответами. –

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

сейчас, я в дилемме, которые отвечают на отметку, как принято, оба ответили на мой запрос по-разному –