2015-05-04 31 views
0

我有一些方法,它做了一些東西,並調用回調,並在一定的時間後,它做同樣的事情。承諾替換多次調用回調gettin

var myFunction = function(callback){ 
    setInterval(function(){ 
    var stuff; 
    //do some stuff 
    callback(stuff) 
    }, 3000); 
} 

我可以將其更改爲承諾函數嗎?如果是,用戶將如何調用該功能?我打算使用藍鳥圖書館。

+1

1.您從'myFunction'返回承諾2.您解決'setInterval'中的承諾 – zerkms

+0

您可以詳細介紹一下您希望完成的承諾嗎? –

+0

我的理解是,當我們呼籲解決問題時,承諾就會完成,我們可以多次調用解析嗎? – Neo

回答

5

承諾是一次性設備。他們一次又一次地解決他們的國家不能改變的問題。因此,它們對於經常性事件不是好的或者可行的替代品。

要使用一個承諾,出現一次以上的事情,你必須有某種接口,允許你每次創建一個新的承諾,並且調用者每次都能以某種方式訪問​​新的承諾。這似乎並不符合您的特定界面。

像您使用的簡單回調是重複事件的最合理的接口。

+0

噢好吧。由於承諾在這裏不起作用,哪一個會更好地解決pub-sub或回調? – Neo

+1

@ neolivz4ever - 如果您有多於一段代碼或者對此事件感興趣的代碼片段數量不確定,那麼您可能需要某種pub-sub解決方案來處理所有對事件流感興趣的內容。但是,如果只有一段代碼,那麼回調可能更簡單並且工作得很好。 – jfriend00

+0

好吧。這就說得通了。謝謝。 :) – Neo

0

OP在關於使用承諾處理從區間觸發函數內進行的異步調用的結果的評論中詢問。這將是這樣的:

var myFunction = function(callback){ 
    setInterval(function(){ 
    var promise = new Promise(function(resolve,reject) { 
     var stuff; 
     // Do some potentially-long-running work that modifies 'stuff' 
     if (stuffWorked) 
     resolve(stuff); 
     else 
     reject(stuff); 
    }); 
    promise.then(function(returnVal) { 
     callback(returnVal); 
    }); 
    }, 3000); 
} 

這是使用ECMAscript 6 form of promises。很多其他的實現存在... jQuery,q等。如果需要,我可以添加其他風味的示例。

+0

即使我們在內部使用諾言,誰曾經使用該方法仍然會用回調調用它,對吧? – Neo