2014-01-29 52 views
1

我有以下功能:

getX: function ($scope) { 
     $http.get('/api/X/GetSelect') 
      .success(function (data) { 
       ... 
       ... 
      }) 
      .error(function (data) { 
       ... 
      }); 
    }, 

我想這總是做的事情在.success塊,但我想它也返回 一個承諾,這樣我可以這樣調用:

getX($scope) 
    .then(function() { 
     doNextThing(); 
} 

有人可以通過告訴我如何編寫代碼以便承諾返回嗎?

回答

3

簡單,你自己回覆一個承諾。您需要爲此注入$qtake a look at the docs for more information)。

然後你就可以更新您的代碼:

getX: function ($scope) { 
    var defer = $q.defer(); 
    $http.get('/api/X/GetSelect').success(function (data) { 
     ... 
     ... 
     defer.resolve(); 
    }).error(function (data) { 
     ... 
     defer.reject(); 
    }); 
    return defer.promise; 
} 
+0

謝謝。我的問題是否正確? – Alan2

+0

是的,這是完全有效的代碼,並將工作。 – thomaux

+0

我試過了。它會返回,但不會等到.success運行。 – Alan2

5

您只需在$ http.get()方法之前添加return語句即可。這將返回承諾。

例子:

return $http.get('/api/X/GetSelect') 
     .success(function (data) { 
      ... 
      ... 
     }) 
     .error(function (data) { 
      ... 
     }); 
+1

+1。這實際上是一個更好的答案。忘記它返回一個承諾:) – thomaux

2
function getX($scope) 
{ 
    var defered = $q.defer(); 
    $http.get('/api/X/GetSelect') 
       .success(function (data) { 
        defered.resolve(data); 
        ... 
       }) 
       .error(function (data) { 
        defered.reject(); 
       }); 
    return defered.promise(); 
    } 

你需要注入$ Q到您的contorller。

+0

我試過這個。它會返回,但不會等到.success運行。 – Alan2

+0

您需要解決成功代碼塊結束時的失敗。 – Alborz

1

您可能需要使用延期承諾。這是你如何做到的。

var functionA = function() { 
    var deferred = $q.defer(); 
    $http.get('url here'). 
      success(function (response) { 
       deferred.resolve(response); 
      }). 
      error(function (response) { 
      }); 
    return deferred.promise; 
} 

現在調用functionA應該返回一個承諾,您可以根據需要執行操作。

+0

謝謝。我編碼的方式是否正確? – Alan2

+0

我試過了。它會返回,但不會等到.success運行。 – Alan2

相關問題