2012-04-23 33 views
10

Tôi đang sử dụng coffescript Iced với js upshot khi tôi làm mới nhiều nguồn dữ liệu. Phương thức làm mới có TWo gọi lại một cho thành công và một cho lỗi và tôi muốn chờ cho mỗi cuộc gọi để thực hiện hoặc gọi lại.Kịch bản cà phê đá với nhiều cuộc gọi lại

Tôi không thể xem cách thực hiện việc này với coffescript không có id mà không cần thực hiện thêm chức năng. Câu hỏi của tôi là - có cách nào tao nhã hơn để tôi có thể trì hoãn một trong nhiều cuộc gọi lại không?

Đây là mã Tôi hiện có:

refreshMe = (key, value, result) => 
    value.refresh(
    (success)=> 
      result success 
    , 
    (fail, reason, error)=> 
     result undefined, fail 
    ) 
@refresh =() =>     
success={} 
fail={} 
await 
    for key, value of @dataSources 
    refreshMe key, value, defer success[key], fail[key] 

Trả lời

5

Đây là cách duy nhất tôi đã tìm thấy để làm điều đó quá. Tôi đang sử dụng nó trong Backbone và quấn (ví dụ) chức năng @save của một mô hình với một @icedSave:

# An IcedCoffeescript friendly version of save 
icedSave: (callback) -> 
    @save {}, 
     success: (model, response) -> callback(true, model, response) 
     error: (model, response) -> callback(false, model, response) 
+0

Đây là cách tôi sẽ làm điều đó, mặc dù nó cũng có thể (nhưng phức tạp hơn) để phân bổ một Rendezvous mới, tạo ra hai trì hoãn từ đó Rendezvous, và sau đó chờ đợi chỉ là người đầu tiên quay trở lại. –

1

Dưới đây là một số mã tôi sử dụng để chuyển đổi Promises .then (-> onSuccess), (-> onError) để errbacks (err, result) ->:

# You can write like this: 
await value.refresh esc defer e, result 


# onError - function to be called when promise rejected. 
# onSuccess - function to be called when promise is fulfilled. 
module.exports = esc = (onError, onSuccess) -> 
    util = require 'util' 
    return (result) -> 
    if util.isError result 
     # Always send back an error to first handler. 
     onError? result 
    else if onSuccess? 
     console.log onSuccess, result 
     # `await fn esc done, defer result` 
     onSuccess? result 
    else 
     # `await fn esc done` 
     onError? null, result 

Bạn có thể sửa đổi chức năng esc một chút để xử lý nhiều đối số cho từng cuộc gọi lại.

0

iced.Rendezvous lib được thực hiện rõ ràng cho trường hợp này: trả lại ở đầu tiên của nhiều cuộc gọi lại. Từ the docs:

Dưới đây là ví dụ hiển thị các đầu vào và đầu ra khác nhau của điểm hẹn. Nó thực hiện hai tra cứu DNS song song, và các báo cáo chỉ khi lợi nhuận đầu tiên:

hosts = [ "okcupid.com", "google.com" ]; 
ips = errs = [] 
rv = new iced.Rendezvous 
for h,i in hosts 
    dns.resolve hosts[i], rv.id(i).defer errs[i], ips[i] 

await rv.wait defer which 
console.log "#{hosts[which]} -> #{ips[which]}" 
Các vấn đề liên quan