2015-05-29 18 views
5

Vì vậy, tôi đã có một ứng dụng Góc giúp thực hiện cuộc gọi yên tĩnh đến máy chủ. Có một dịch vụ kết thúc cuộc gọi đến máy chủ. Tôi hiện đang có một phương thức trên dịch vụ đơn giản trả lại lời hứa từ dịch vụ $ http. Tôi muốn thêm một số xử lý bổ sung vào cuộc gọi phương thức đó, nhưng tôi không chắc chắn làm thế nào để làm điều đó vì bản chất không đồng bộ của lời hứa.Angular Service Promises

Hiện nay trong nguyên cảo:

class BoardService { 
    private $http; 

    constructor($rootScope: IRootScope, $http: ng.IHttpService) { 
      this.$http = $http; 
    } 

    fetchBoard(id: number) { 
     return this.$http.get("/api/board/" + id); 
    } 
} 

Tôi muốn làm cho nó một cái gì đó như thế này:

fetchBoard2(id: number) { 
    this.$http.get("/api/board/" + id).success(function(data) 
    { 
     // Manipulate the data 

    }); 

    // return manipulated data; 
} 

Làm thế nào bạn sẽ làm điều này?

Trả lời

10

Cảnh báo câu khó! Bởi vì lời hứa là không đồng bộ, bất kỳ thứ gì trả về dữ liệu dựa trên dữ liệu từ lời hứa phải tự trả về lời hứa. Bạn muốn fetchBoard2 trả lại lời hứa được giải quyết sau khi lời hứa $http đã trở lại và bạn đã thao tác dữ liệu. Bạn làm điều này với dịch vụ $q của Angular.

fetchBoard2(id: number) { 
    var deferred = $q.defer(); 

    $http.get("/api/board/" + id).success(function(data) { 
    var newData = doSomething(data); 
    deferred.resolve(newData); 
    }); 

    return deferred.promise; 
} 

Quản lý thêm đối tượng thu nhập hoãn lại được một cách nhanh chóng khó sử dụng, vì vậy bạn có thể sử dụng để chèn then thao tác riêng của bạn vào các đường ống dẫn.

fetchBoard3(id: number) { 
    return $http.get(...).then(function(data) { 
    return doSomething(data); 
    }); 
} 

Để biết thêm chi tiết, đây là a good article.

+1

Theo như tôi biết, .success() cư xử giống như .Sau đó() và trả về một nguồn gốc lời hứa quá. return $ http.get(). success() cũng sẽ hoạt động. – Okazari

+3

Hầu như - cảm ơn bạn đã xác minh điều này. 'success' trả về lời hứa ban đầu (chứa đáp ứng HTTP), và' then' trả về một lời hứa mới được giải quyết với kết quả của hàm mà bạn đưa ra. Tham khảo: http://stackoverflow.com/a/23805864/802618 –

+1

Thx cho việc bổ sung, không phải bây giờ điều này chính xác. – Okazari

0

Mô-đun $http chỉ hiển thị phiên bản không đồng bộ XMLHttpRequest để chữ ký bạn đang tìm kiếm là không thể. Trừ khi muốn dự phòng sang một khung công tác khác (ví dụ: jQuery), bạn sẽ phải sử dụng đối tượng Promise được trả lại.

Hãy coi đó là đối tượng nhà máy mà bạn đăng ký trình xử lý sẽ được gọi khi dữ liệu quay lại. Chúng có thể bị xiềng xích, vì vậy nếu bạn muốn xử lý dữ liệu trước khi đưa nó xuống hạ lưu, bạn có thể làm điều đó đơn giản trong trình xử lý mà bạn đăng ký với then method. Bất kỳ kết quả nào bạn trả về trong trình xử lý sẽ trở thành dữ liệu cho trình xử lý then tiếp theo.

(Xin lưu ý rằng không giống như success(), lập luận để xử lý của bạn là IHttpPromiseCallbackArg loại không phải là dữ liệu riêng của mình.)