函数中的承诺

时间:2016-03-03 13:56:04

标签: javascript promise

我的程序会下载大量数据,对其进行处理,并通过返回的函数使其可用。该程序得到了下载的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");

具体要求是:

  1. 仅下载一次数据。
  2. 按键查询数据任意次,无需再次下载数据。
  3. 请勿更改现有界面。
  4. 我可以让dataSource返回一个承诺而不是一个函数。我知道使用promises的模式是什么样的。但这将迫使我重写使用此功能的代码。这种模式在整个代码中被广泛使用,改变它并不是一个可接受的解决方案。

    我如何构建它以确保我的函数在没有返回承诺的情况下直到它有数据才会返回?

2 个答案:

答案 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();