2016-03-02 208 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蓋此功能

編輯1

so你的決心代碼應該是這樣的

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