我的程序会下载大量数据,对其进行处理,并通过返回的函数使其可用。该程序得到了下载的ahread,所以我添加了promises以使其等待数据到达。
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");
具体要求是:
我可以让dataSource
返回一个承诺而不是一个函数。我知道使用promises的模式是什么样的。但这将迫使我重写使用此功能的代码。这种模式在整个代码中被广泛使用,改变它并不是一个可接受的解决方案。
我如何构建它以确保我的函数在没有返回承诺的情况下直到它有数据才会返回?
答案 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(" ");
});
不需要传播,但它有助于说明目的
答案 1 :(得分:-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);
}
然后,在使用代码的地方,从返回的promise中获取generate
函数:
let generate = function() {};
dataSource.then(fn => generate = fn).done();