2013-07-07 34 views
25

Có cách nào để chuỗi Promises cùng nhau trong Coffeescript. Ví dụ, hãy xem xét các mã javascript sau,Chaining Promises trong Coffeescript

return $.getJSON('/api/post.json') 
    .then(function(response) { 
    // do something 
    }) 
    .then(function(response) { 
    // do something 
    }) 
    .then(null, function(err) { 
    // do something 
    }); 

Mỗi phòng trong số then's là không bắt buộc, và trận chung kết then cần được trả về bởi hàm. Hiện tại tôi đang viết điều này bằng coffeescript là,

promise = $.getJSON('/api/post.json') 
promise = promise.then (response) -> 
    // do something 

promise = promise.then (response) -> 
    // do something 

promise = promise.then null, (err) -> 
    // do something 

return promise 

Có cách nào tốt hơn để làm điều này? Cảm ơn.

+0

Bạn cũng có thể xem IcedCoffeeScript. Nó hoạt động hơi khác một chút, nhưng nó hoạt động khá tốt. –

Trả lời

40

Ezekiel hiển thị đúng cách, nhưng không cần dấu ngoặc đơn xung quanh các hàm. Chỉ cần làm:

$.getJSON '/api/post.json' # As of CoffeeScript 1.7, you don't need the parentheses here either. 
.then (response) -> 
    # do something 
    response # if you would not return anything, promise would be fulfilled with undefined 
.then (response) -> 
    # do something 
    undefined # necessary to prevent empty function body 
.then null, (err) -> 
    # handle error 

Tôi nghĩ rằng nó hoàn toàn sạch sẽ. Điều tương đối lộn xộn là khi bạn cần thêm bộ xử lý onRejected và onFulfilled cùng một lúc.

Lưu ý: Lần cuối tôi kiểm tra, điều này không hoạt động trong CoffeeScript Redux, nhưng đây là một vài tháng trước.

Lưu ý 2: Bạn cần ít nhất một dòng mã thực tế (nghĩa là không chỉ là một nhận xét) trong từng hàm chức năng để hoạt động này. Thông thường, bạn sẽ, vì vậy nó không phải là một vấn đề lớn.

+0

Cảm ơn. Điều này làm việc trong trình biên dịch Coffeescript. –

+0

Bị bỏ qua vì điều này không biên dịch trong CoffeeScript 1.4.0 hoặc 1.6.3 (mới nhất). Các dấu ngoặc đơn như được hiển thị trong câu trả lời của tôi là bắt buộc. –

+4

@EzekielVictor: Cảm ơn vì đã cảnh giác. Tôi chỉ nhìn vào nó, và vấn đề dường như là phần thứ hai của chuỗi thiếu một cơ quan chức năng. Bình luận thụt vào dường như không đủ. Tôi đã thêm một "không xác định" rõ ràng ở cuối để biên dịch. Tôi chưa bao giờ gặp phải vấn đề này bởi vì tôi chưa bao giờ có các cơ quan chức năng không trống ở những nơi này. –

4

Đây có lẽ là tốt nhất mà bạn sẽ thực hiện:

$.getJSON('/api/post.json') 
    .then((response) -> 
     # do something 
    ).then((response) -> 
     # do something 
    ).then null, (err) -> 
     # do something 

Lưu ý các dấu ngoặc đơn bao quanh then() đối số. Không có gì trái đất vỡ tan nhưng hy vọng điều này sẽ giúp.

+0

Cảm ơn. Mất dấu ngoặc đơn, như @Meryn Stol gợi ý làm cho nó tốt hơn một chút. –

+3

Mất dấu ngoặc đơn? Tôi đoán bạn có nghĩa là mất chúng. Ý nghĩ mất dấu ngoặc đơn trên thế giới thật đáng sợ. –

12

Đây là cách yêu thích cá nhân của tôi để viết những lời hứa, với một chút thêm thụt đầu dòng

doSomething =() -> new RSVP.Promise (resolve, reject) -> 
    if 1 is 1 
    resolve 'Success' 
    else 
    reject 'Error' 

doSomething() 
.then (res) -> 
     console.log 'Step 1 Success Handler' 

    , (err) -> 
     console.log 'Step 1 Error Handler' 

.then (res) -> 
     console.log 'Step 2 Success Handler' 

.then (res) -> 
     console.log 'Step 3 Success Handler' 

    , (err) -> 
     console.log 'Step 3 Error Handler' 

nào biên dịch để:

var doSomething; 

doSomething = function() { 
    return new RSVP.Promise(function(resolve, reject) { 
    if (1 === 1) { 
     return resolve('Success'); 
    } else { 
     return reject('Error'); 
    } 
    }); 
}; 

doSomething().then(function(res) { 
    return console.log('Step 1 Success Handler'); 
}, function(err) { 
    return console.log('Step 1 Error Handler'); 
}).then(function(res) { 
    return console.log('Step 2 Success Handler'); 
}).then(function(res) { 
    return console.log('Step 3 Success Handler'); 
}, function(err) { 
    return console.log('Step 3 Error Handler'); 
}); 

Có một số trường hợp này hoạt động thực sự tốt quá:

step1Success = (res) -> console.log 'Step 1 Success Handler' 
step1Error = (err) -> console.log 'Step 1 Error Handler' 

step2Success = (res) -> console.log 'Step 2 Success Handler' 

step3Success = (res) -> console.log 'Step 3 Success Handler' 
step3Error = (err) -> console.log 'Step 3 Error Handler' 

doSomething() 
    .then(step1Success, step1Error) 
    .then(step2Success) 
    .then(step3Success, step3Error) 

Được thử nghiệm trên tập lệnh cà phê v1.6.3

+0

Điều này làm việc độc đáo, và điều duy nhất treo tôi lên một chút là đảm bảo bạn không có bất kỳ khoảng trống nào trong mã. Điều này có lẽ là phổ biến cho những người mới đến coffeescript, nhưng tôi không thể nhận được mã như trên để biên dịch cho đến khi tôi nhận ra tôi đã có một không gian duy nhất trong tập hợp các tab. –