2014-07-17 26 views
20

Tôi đang cố gắng thu hút những lời hứa trong JavaScript (đặc biệt là AngularJS).Ngay lập tức trả lại lời hứa đã được giải quyết bằng AngularJS

Tôi có chức năng trong một dịch vụ, hãy gọi nó là fooService, kiểm tra xem chúng tôi đã tải một số dữ liệu chưa. Nếu có, tôi chỉ muốn nó trở lại, và nếu chúng ta không có, chúng ta cần nạp dữ liệu và trả về một lời hứa:

this.update = function(data_loaded) { 
    if (data_loaded) return; // We've loaded the data, no need to update 

    var promise = Restangular.all('someBase').customGet('foo/bar').then(function(data) { 
     // Do something with the data here 
    } 

    return promise; 
} 

Tôi có một chức năng mà sau đó gọi update chức năng của fooService như vậy :

fooService.update(data_loaded).then(function() { 
    // Do something here when update is finished 
}) 

vấn đề của tôi ở đây là nếu chúng ta không cần phải tải các dữ liệu trong update chức năng, một lời hứa không được trả lại, vì vậy .then() không được gọi là chức năng khác của tôi. Phương pháp tiếp cận nào nên ở đây - về cơ bản tôi muốn trả lời lời hứa đã được giải quyết ngay lập tức từ chức năng update() nếu chúng tôi không cần nhận dữ liệu từ cuộc gọi Restangular?

Trả lời

26

Câu trả lời được chấp nhận hiện nay là quá phức tạp, và lạm dụng các deferred anti pattern. Dưới đây là một phương pháp đơn giản hơn:

this.update = function(data_loaded) { 
    if (data_loaded) return $q.when(data); // We've loaded the data, no need to update 

    return Restangular.all('someBase').customGet('foo/bar') 
          .then(function(data) { 
     // Do something with the data here 
    }); 
}; 

Hoặc, thậm chí hơn nữa:

this._updatep = null; 
this.update = function(data_loaded) { // cached 
    this._updatep = this._updatep || Restangular.all('someBase') // process in 
               .customGet('foo/bar'); //.then(.. 
    return this._updatep; 
}; 
+1

Cảm ơn bạn đã có mẹo. Tôi luôn luôn bỏ lỡ cú pháp 'Q (initialVal)' của [Kris Kowal's Q] (https://github.com/kriskowal/q) và nên biết '$ q.when (data)' có thể thực hiện cùng một thủ thuật. – runTarm

-1

Bạn có thể sử dụng $q.defer() như thế này:

this.update = function (data_loaded) { 
    var deferred = $q.defer(); 

    if (data_loaded) { 
     deferred.resolve(null); // put something that your callback will know the data is loaded or just put your loaded data here. 
    } else { 
     Restangular.all('someBase').customGet('foo/bar').then(function(data) { 
      // Do something here when update is finished 
      deferred.resolve(data); 
     } 
    } 

    return deferred.promise; 
}; 

Hope this helps.

+0

Chính xác những gì tôi đang tìm - cảm ơn! :) – samturner

+8

Tôi không có ý tưởng làm thế nào điều này đã upvoted hai lần, đây là mô hình chống trì hoãn và có thể được đơn giản hóa rất nhiều. –

+0

Nó không chỉ là antipattern trì hoãn, nó cũng không truyền bá lỗi. – Bergi

6

Dịch vụ $q của AngularJS sẽ giúp bạn tại đây. Nó giống như thư viện lời hứa Kris Kowal's Q.

Khi bạn có phương thức không đồng bộ có thể trả lại lời hứa hoặc giá trị, hãy sử dụng phương thức $q.when. Nó sẽ đưa những gì đã từng được truyền cho nó, có thể là một lời hứa hay một giá trị và tạo ra một lời hứa sẽ được giải quyết/bị từ chối dựa trên lời hứa được thông qua, hoặc giải quyết nếu một giá trị được thông qua.

$q.when(fooService.update(data_loaded)).then(function(data){ 
    //data will either be the data returned or the data 
    //passed through from the promise 
}) 

và sau đó trong chức năng cập nhật của bạn trả lại dữ liệu thay vì chỉ trở về

if (data_loaded) return data_loaded; 
31

Như lời hứa của bạn sử dụng cú pháp giống như một hoạt Javascript bản xứ, bạn có thể sử dụng và trả về một lời hứa Javascript đã được giải quyết: Promise.resolve()

return(Promise.resolve("MyReturnValue")); 
+0

Đây là câu trả lời tôi muốn; Tôi có một giá trị; nó đã sẵn sàng, tôi chỉ muốn bọc nó trong một Promise để đáp ứng các API mà mong đợi Promises ... Vì vậy, trong khi OP hỏi, "Ngay lập tức trở lại một lời hứa giải quyết", những gì ** tôi muốn là "trả lại một Promise, mà Tôi giải quyết ngay lập tức (với một chữ) " –

+0

Đó là những gì tôi muốn. Tôi có một đối tượng và chỉ cần trả lời một lời hứa vì đó là những gì API mong đợi. – richard

+0

Cẩn thận với hỗ trợ của IE về câu trả lời này. $ q cung cấp hỗ trợ trình duyệt chéo –

Các vấn đề liên quan