2014-05-15 28 views
0

我得到一個幾乎和我一樣的錯誤。然後在我的異步調用完成之前觸發。我意識到我正在循環的API後,但我目前只用1然後似乎在異步返回值之前觸發值

服務數組大小嚐試它:

this.saveTags = function (tag) { 
     $http({ 
      method: "POST", 
      url: '/api/projects/' + data.Id + '/tags', 
      data: ({ Name: tag.Name }) 
     }).then(function (response) { 
      console.log(response.data) 
      if (typeof response.data === 'object') { 
       return response.data; 
      } else { 
       // invalid response 
       return $q.reject(response.data); 
      } 
     }, function (response) { 
      // something went wrong 
      return $q.reject(response.data); 
     }); 

控制器:

tags.forEach(function(tag) { 
      counter++; 
      data.saveTags(tag).then(function(data) { 
       console.log(data) 
      }); 
     }); 

錯誤:

enter image description here

回答

1

您需要從函數中返回一個承諾,在$http POST請求完成時解決或拒絕。

它看起來像,而不是你想從$http函數本身返回rejectresolve產品,而你的saveTags函數結束(即從你forEach環)沒有返回到調用者。

試試這個:

this.saveTags = function (tag) { 
    var deferred = $q.defer(); 

    $http({ 
     method: "POST", 
     url: '/api/projects/' + data.Id + '/tags', 
     data: ({ Name: tag.Name }) 
    }).then(function (response) { 
     console.log(response.data) 
     if (typeof response.data === 'object') { 
      deferred.resolve(response.data); 
     } else { 
      // invalid response 
      deferred.reject(response.data) 
     } 
    }, function (response) { 
     // something went wrong 
     deferred.reject(response.data) 
    }); 

    return deferred.promise; 
} 
+0

我認爲這個問題可能來自data.saveTags(標籤)。然後(函數())沒有返回任何 – allencoded

+1

另外,我有更好的體驗,當我分配結果$ http到一個變量並使用variable.then(...);.除此之外,這是非常好的結構和一個很好的答案。 – MBielski

+0

@allencoded不確定你的意思。你報告的錯誤顯示你正試圖在未定義的地方調用'then'。你的'saveTags'函數沒有用'then'方法返回一個對象。如果你返回deferred.promise,即使你的$ http調用沒有返回結果,你仍然會用'then'方法返回一些東西,這樣可以避免錯誤。 –