2014-02-20 42 views
0

所以我想在瀏覽器中加載這些連續的異步數據。我喜歡Promises,他們很好,不是嗎?編程樂趣,易於閱讀。連續承諾/ A + loading

在我的問題中,我不會不斷更新瀏覽器中的某些資源,例如圖像。那時有兩部分:生產者和消費者。在同步代碼中,它可能看起來像這樣:

var p = producer(), 
    data = null; 

while (data = p.next()) { 
    consumer.update(data) 
} 

這將如何轉換爲異步,啓用Promise/A +的代碼?

UPDATE

我結束了使用下列基本類:

class Stream 
    input : null 
    output : null 
    # @param {function} callback 
    end : (callback) -> @end_callback = callback 
    # @param {Stream} writable 
    # @return {Stream} 
    pipe : (writable) -> writable.input = @ ; @output = writable 
    # @param {function} callback 
    # @return {Stream} 
    data : (callback) -> 
     setTimeout => 
      last = @ 
      chain = [@] 
      while last.input != null 
       last = last.input 
       chain.push(last) 
      last = chain.pop() 
      next = => 
       thenable = last.read() 
       if thenable is null and @end_callback 
        return @end_callback() 
       thenable.then (value) => 
        if not chain.length 
         callback(value) 
         @data(callback) 
        else 
         last = chain.pop() 
         last.write(value) 
         next() 
      next() 
     , 0 
     @ 

只實現read方法,返回一個Promise或空,或兩者readwrite創造轉變流。

回答

1

你在說什麼更多的是流而不是承諾 - 也許有一個更合適的庫。如果不是,你可能想看看我的"Lazy Promise Stream" implementation

如何將[輪詢]轉換爲異步,啓用Promise/A +的代碼?

producer()next()方法將返回承諾。然後,你在一個遞歸的方式就不斷循環,在他們:如果你知道這是沒有錯誤的無限流

function getNext() { 
    return p.next().then(function(data) { 
     consumer.update(data); 
     return getNext(); 
    }); 
} 
getNext(); 

return小號可以省略,如getNext()將始終懸而未決

+0

不錯,這是我想出了太多,我只是想知道是那裏什麼。事實上,我的情況是流。 Thx爲鏈接。 – skrat

-1

我如果你有一個生產者消費者組合,你可能會想從你的描述中使用'Web Workers'。

「工作人員」將被髮送工作,然後在某些點返回消息,例如完成時。 您可以收聽消費者中的onmessage事件,並決定要執行的操作,例如發送更多工作,或者在完成後處理結果。

看一看的MDN指南,看看它是否適合你的需要:

https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers

+0

謝謝,我熟悉WebWorker,我的用例不同,生產者實際上使用XHR,因此無法在WebWorker中執行。 – skrat

+0

@skrat:XHR可以在WebWorkers中完成嗎? – Bergi

+0

XHR可用於網絡工作者,詳見我發佈的鏈接,並在此處進一步擴展:https://developer.mozilla.org/en-US/docs/Using_workers_in_extensions – dougajmcdonald