2015-06-27 28 views
5

Tham khảo Rookie sai lầm # 4: sử dụng "hoãn" trong bài viết Nolan Lawson 's: (! Btw một bài tuyệt vời) We have a problem with promises, tôi cố gắng không sử dụng lời hứa phong cách thu nhập hoãn lại nữa không. Gần đây tôi đã gặp phải một ví dụ thực tế mà tôi không thể tìm ra cách để KHÔNG mã này theo cách trì hoãn, vì vậy tôi cần một số lời khuyên.Làm thế nào để chuyển đổi lời hứa này hoãn lại phong cách để ES6 phong cách hứa hẹn

Dưới đây là ví dụ, một nhà máy góc:

function ConfirmModal($q, $modal) { 
    return { 
     showModal: function _showModal(options) { 
      var _modal = $modal(options) 
      var deferred = $q.defer() 

      _modalScope.confirm = function(result) { 
       deferred.resolve(result) 
       _modal.hide() 
      } 

      _modalScope.cancel = function(reason) { 
       deferred.reject(reason) 
       _modal.hide() 
      } 

      return deferred.promise 
     } 
    } 
} 

Tôi giấu một số chi tiết không liên quan, ý tưởng cốt lõi là (ví dụ như thực hiện _modalScope.): $modal cung cấp một widget ui, trong đó có hai nút: ConfirmHủy. Khi Xác nhận được nhấp, hãy gọi _modalScope.confirm và giải quyết lời hứa hoãn lại, nếu không từ chối lời hứa hoãn lại bằng cách gọi _modalScope.cancel khi Hủy được nhấp.

tôi cố gắng viết lại bằng cách sử dụng return $q(function(resolve, reject) { ... }), nhưng tôi thực sự không biết làm thế nào/khi gọi resolvereject trong constructor này, bởi vì logic thực tế là trong phương pháp _modalScope.confirm/cancel. Tôi đang vật lộn với vấn đề này trong nhiều ngày, thực sự hy vọng ai đó có thể giúp tôi.

Cảm ơn!

+1

Trong thực tế, bạn không sử dụng các [antipattern hoãn lại] (http : //stackoverflow.com/q/23803743/1048572) ở đây, bởi vì '$ modal' không phải là một lời hứa api rồi. Trì hoãn là hoàn toàn tốt đẹp cho những điều hứa hẹn! – Bergi

+0

@Bergi ồ, khá rõ, tôi không nhận ra điều đó, cảm ơn! – nightire

Trả lời

4

Giả mã trong câu hỏi của bạn là chức năng và _modalScope thể truy cập từ _showModal() chức năng, sau đó mã dưới đây sẽ trả lời câu hỏi của bạn:

function ConfirmModal($q, $modal) { 
    return { 
     showModal: function _showModal(options) { 
      return $q(function(resolve, reject) { 
       var _modal = $modal(options) 

       _modalScope.confirm = function(result) { 
        resolve(result) 
        _modal.hide() 
       } 

       _modalScope.cancel = function(reason) { 
        reject(reason) 
        _modal.hide() 
       } 
      }); 
     } 
    } 
} 
+0

Tôi đã thử điều này trước đây và tôi nghĩ rằng nó không hoạt động, và tôi đã thử nó một lần nữa sau khi đọc câu trả lời của bạn, nó thực sự hoạt động! Tôi nghĩ rằng nó không hoạt động bởi vì góc ném một lỗi, nhưng tôi đã không đọc nó một cách cẩn thận, hóa ra lỗi không liên quan đến sửa đổi này, xấu của tôi. Cảm ơn bạn rất nhiều. – nightire

+0

Bạn được chào đón! :-) – JME

+0

Sẽ không hoạt động với Angular 1.2. Không chắc chắn về Góc 1.3. Dường như làm việc với Angular 1.4 và 1.5. –

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