2016-03-03 96 views
-3

我的程序下載大量數據,對其進行處理,並通過返回的函數使其可用。該程序會下載下載的消息,因此我添加了許諾以等待數據到達。函數中的承諾

function dataSource(...) { 

    var _data = null; 

    // download: a promise that returns data for the _data object. 
    let download = function() { ... } 

    return function(...) { 

    if (!_data) { 
     download(...).then(data => _data = data).done(); 
    } 

    var datum = _data[key]; 
    var outbound = doSomethingWithData(datum); 
    return outbound; 
    } 

} 

我的代碼是這樣構造的,因爲Engine返回的函數使我的代碼非常整齊。

var generate = dataSource(param1,param2); 
var fullName = generate("malename")+" "+generate("malename")+" "+generate("surname"); 

的具體要求是:

  1. 和下載數據只有一次。
  2. 按任意次數按鍵查詢數據,無需再次下載數據。
  3. 不要更改現有的接口。

我可以有dataSource返回一個承諾,而不是一個函數。我知道使用承諾的模式是什麼樣子。但是這會迫使我重寫使用這個函數的代碼。這種模式在整個代碼中廣泛使用,並且改變它並不是一個可接受的解決方案。

我該如何構造這個以確保我的函數在它沒有返回承諾之前不會返回數據?

+1

的可能的複製[如何從一個異步回調函數的返回值?](http://stackoverflow.com/questions/6847697/how-to-return-value-from-an-asynchronous-callback-function) – Hacketo

+0

根本不是該問題的重複。不同的要求。 –

回答

0

這應該修復它

function dataSource(){ 
    return function(){ 
     return download(...).then(data=>doSomethingWithData(data[key])); 
    }; 
} 
var generate = dataSource(); 
Promise 
.all(["malename","malename","surname"].map((name)=>return generate(name))) 
.spread((name1,name2,name3)=>{ 
    return [name1,name2,name2].join(" "); 
}); 

是不需要的傳播,但它有助於說明目的

+0

'.spread'是特定於某個特定的庫,是不是? –

+0

需要重寫使用該函數的代碼。不能接受的。 –

+0

您的消耗函數的代碼不正確。所以它需要以任何方式重寫。 – aclave1

-2

有無dataSource返回一個承諾,而不是數據的功能。修訂後的dataSource看起來像這樣:

function dataSource(...) { 

    var _data = null; 

    // download: a promise that returns data for the _data object. 
    let download = function() { ... } 

    function _generate(...) {...} 

    return download(group,subgroup,options).then(data => _data = data).then(() => _generate); 
} 

然後,在代碼被消耗,從返回的承諾得到了generate功能:

let generate = function() {}; 
dataSource.then(fn => generate = fn).done();