2013-03-20 28 views
6

Tôi gặp vấn đề với lời hứa jQuery 1.9.1, nơi mà tôi có khả năng cần logic điều kiện sẽ trả về một trì hoãn khác và tôi không chắc chắn cách xử lý nó. Đây là nỗ lực tốt nhất của tôi, nhưng như ý kiến ​​chỉ ra bên dưới, khi tôi nhấn nhánh khác, tôi vẫn nhấn hàm thứ hai .then(), nơi tôi hy vọng tôi có thể quay lại với người dùng. Bất kỳ mô hình nào về cách xử lý một kịch bản như vậy?Xử lý các chi nhánh với Promises

storage.provision(c) 

.then(function(rc){ 
    if(rc === 0){ 
     storage.write(c); 
    }else{ 
     return options.onSuccess(rc); //how i got back to the users callbacks/promise, but this 
     //takes me to the .then below 
    } 
}) 
//storage.write returns a promise as well, do I do another .then 
// like this? 
.then(function(rc){ 
    //I was hoping this would catch, the storage.write() case, and it does, but it also catches 
    //the retun options.onSuccess(rc) in the else case. 
    options.onSuccess(rc); 
}) 


.fail(function(e){ 
    //handle error using .reject() 
}); 
+0

Bài đăng này có thể giúp bạn: http://stackoverflow.com/questions/12149993/attempting-to-break-jquery-promise-chain-with-then-fail-and-reject – mattytommo

+0

[Bài đăng này] (http: //net.tutsplus.com/tutorials/javascript-ajax/wrangle-async-tasks-with-jquery-promises/) sẽ giúp bạn hiểu lời hứa tốt hơn. Nói chung nếu bạn muốn sử dụng điều kiện, bạn nên lưu lời hứa như là một biến và thực hiện 'sau đó'' thành công' hoặc 'thất bại' bên trong điều kiện của bạn, bạn dường như đang làm nó theo cách khác. – acconrad

Trả lời

4

này trở nên dễ dàng hơn bằng cách lấy điểm cho rằng options.onSuccess(rc); được thực hiện vô điều kiện trong lần thứ hai .then() nhưng không bao giờ trong lần đầu tiên.

Như vậy, .then() trước tiên phải vượt qua trên rc một trong hai:

  • nếu rc === 0, để đáp ứng với storage.write(c) hoàn
  • hoặc ngay lập tức nếu rc !== 0.

.then() thực sự hữu ích vì điều này tự nhiên cho phép giá trị của Lời hứa mới được trả về từ cuộc gọi lại done.

storage.provision(c).then(function(rc) { 
    if(rc === 0) { 
     var dfrd = $.Deferred(); 
     storage.write(c).done(function() { 
      dfrd.resolve(rc); 
     }).fail(dfrd.fail); 
     return dfrd.promise(); 
    } else { 
     return rc;//pass on rc to the second .then() 
    } 
}).then(function(rc){ 
    options.onSuccess(rc); 
}).fail(function(e){ 
    //handle error using .reject() 
}); 

Tôi chắc chắn các phương pháp tiếp cận khác tồn tại nhưng đây là cách gần nhất tôi có thể nghĩ đến khái niệm ban đầu của bạn. Nó sẽ là tốt đẹp không phải tạo ra một hoãn mới khi rc === 0 nhưng đó là cách tiếp cận thực tế nhất để đi qua trên rc, tránh sự cần thiết phải sửa đổi storage.write() để hành xử theo cách này.

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