2016-03-02 4 views
1

У меня есть вопросы относительно использования $ q.when. Вот код, который у меня есть:

Вот код, у меня есть:

resolve: { 
    get: ['$q','testService','$stateParams', 
     ($q,tes,$stateParams) => { 
      // I am doing a check here to see if the qs 
      // array has been populated. If it has then 
      // I want to return a resolve. If not then 
      // I want to return getQuestions() 
      $q.when($stateParams.qs); 

      // getQuestions() will return a promise 

      }] 
     }, 

Может кто-нибудь дать мне несколько советов о том, как я могу это сделать? Вот одна идея, что у меня есть, но я не уверен, что так должно быть сделано. В частности, я не уверен, что мне нужно включить return, а также не уверен, что мне понадобится второй $, когда в части разрешения первого $ when.

resolve: { 
    get: ['$q','testService','$stateParams', 
     ($q,tes,$stateParams) => { 
      return $q.when($stateParams.qs) 
      .then(() => { 
       return $q.when("success"); 
      }, 
      () => { 
       return getQuestions(); 
      } 
      }] 
     }, 

ответ

0

Это, как представляется, подходит для меня:

resolve: { 
    get: ['$q','testService','$stateParams', 
     ($q,tes,$stateParams) => { 
      if ($stateParams.qs) { 
       return $q.when(); 
      else { 
       return getQuestions(); 
      } 
}, 
2

$q.when(someVariable) используется, чтобы обернуть ваши данные в уже решены обещание и передать его по обещанию цепи при возвращении его

при решении, как так

resolve: { 
    get: function(response) { 
     return $q.when(response.data); 
    } 
} 

вам нужно вернуть обещание в противном случае вы сломаете цепочку, а приведенный ниже код не будет работать должным образом.

вы в основном передать разрешенную объект посыла в контроллер, так что внутри вас контроллер вы могли приковать его в другой then

внутри контроллера:

get.then(function(data) { 
    console.debug("this is my raw data: ", data); 
}, function(rejected) { 
    // this won't run 
} 

$q docs крышка эта функция

EDIT 1

поэтому код решительность должно быть что-то вроде этого

resolve: { 
     get: ['$q','testService','$stateParams', ($q,tes,$stateParams) => { 
      return $q.when($stateParams.qs); 
     }] 
    }, 

и внутри контроллера

get.then(() => { 
      return "success"; 
     }, 
     () => { 
      return getQuestions(); 
     }) 

, но потому, что вы уже вернуть $ q.when (который всегда разрешен), строка return getQuestions(); никогда не будет работать. поэтому вы должны, вероятно, удалить $ q.when внутри разрешения.

EDIT 2

, если Вы хотите, чтобы getQuestion разрешить после QS затем сделать это как так

resolve: { 
    get: function(response) { 
     return $q.when("success"); // or just return "success" 
    }).then(function(response) { 
     if (response==="success") { // you can skip it 
      return $q.when(getQuestions()); 
     } else { 
      return $q.reject("Some error"); // a throw would work the same 
     } 
    }) 
} 

, если вы не возражаете использовать порядка $ q.all

get: function() { 
    return $q.all(["success", getQuestions()]).then(function(results) { 
     var res1 = results[0]; // success 
     var res2 = results[1]; // the questions 
)} 
+0

Благодарим за отзыв, но я все еще довольно смущен. Можете ли вы показать мне пример того, как вы думаете, что я мог бы реализовать возврат обещания с кодом в вопросе, чтобы я мог лучше понять. – Alan2

+0

В частности, я пытаюсь использовать: when (value, [successCallback], [errorCallback], [progressCallback]); либо сделать вызов getQuestions, либо не зависеть, если у меня уже есть данные. В этом примере на самом деле у меня нет контроллера, так как это метод разрешения ui-router. – Alan2

+0

отредактировал мой ответ – svarog

Смежные вопросы