【问题标题】:A promise within a function函数中的承诺
【发布时间】:2016-06-16 21:29:48
【问题描述】:

我的程序下载了大量数据,对其进行处理,并通过返回的函数使其可用。该程序获得了下载,所以我添加了让它等待数据到达的承诺。

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 返回一个承诺而不是一个函数。我知道使用 Promise 的模式是什么样的。但这将迫使我重写使用此函数的代码。这种模式在整个代码中被广泛使用,更改它不是一个可接受的解决方案。

我如何构造它以确保我的函数在获得数据之前不会返回,而不返回承诺?

【问题讨论】:

标签: javascript promise


【解决方案1】:

这应该可以解决它

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(" ");
});

不需要展开,但它有助于说明目的

【讨论】:

  • .spread 是特定于特定库的,不是吗?
  • 需要重写使用函数的代码。不可接受。
  • 您使用该函数的代码不正确。所以无论哪种方式都需要重写。
【解决方案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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2018-10-04
    • 2016-11-11
    • 2017-12-18
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多