【问题标题】:How do I do this jquery pattern in dart? [duplicate]如何在飞镖中执行此 jquery 模式? [复制]
【发布时间】:2015-02-21 18:17:59
【问题描述】:

我正在尝试将以下 javascript/jquery 代码转换为 dart,但我无法理解期货的工作原理。

function fnA() {
    fnB().then(function() {
        // do something
    }
}

function fnB() {
   var ret = $.Deferred();

   _db.open(database_name).then(function() {
       var defers = [];

       _db.keys().forEach(function(key_name) {
          var key_dfd = $.Deferred();
          defers.push(key_dfd);
          _db.getByKey(key_name).then(function(data) {
              key_dfd.resolve(data);
          });
       });
       $.when(defers).then(ret.resolve);
   })
   .fail(function() {
       ret.reject();
   });

   return ret.promise();
}

我以为我可以像以下那样做,但它似乎不起作用:

(我在数据库中使用了草地)

void fnA() {
    fnB().then((_) {
        // Here, all keys should have been loaded
    });
}

Future fnB() {
    return _db.open().then((_) {
        return _db.keys().forEach((String key_name) {
             return _db.getByKey(key_name).then((String data) {
                  // do something with data
                  return data;
             });
        });
    });
}

【问题讨论】:

  • 您没有发现任何defers 中发生的错误!!!不要使用你自己的new Deferred,而只是返回你已经拥有的承诺……

标签: javascript jquery dart promise dart-async


【解决方案1】:

我做了一些改进,但没有测试代码:

void fnA() {
    fnB().then((_) {
        // Here, all keys should have been loaded
    });
}

Future fnB() {
  return _db.open().then((_) {
    List<Future> futures = [];
    return _db.keys().forEach((String key_name) { 
      futures.add(_db.getByKey(key_name).then((String data) {
        // do something with data
        return data;
      }));
    }).then(() => Future.wait(futures));
  });
}

【讨论】:

  • 不幸的是,这不起作用,因为当执行Future.wait 时,futures 列表是空的,因为 forEach 还没有运行。
  • 那也行不通。 () =&gt; 返回一个函数,而不是列表想要的 Future
  • () => 返回一个函数,但 .then()... 返回一个 Future
【解决方案2】:

暂时使用 JavaScript/jQuery,fnB 可以(假设兼容 Promise 实现)更有效地编写如下:

function fnB() {
    return _db.open(database_name).then(function() {
        return $.when.apply(null, _db.keys().map(function(key_name) {
            return _db.getByKey(key_name);
        }));
    });
}

据我从 Dart 文档中可以看出,这应该转化为 Dart,如下所示:

function fnB() {
    return _db.open().then(function() {
        return Future.wait(_db.keys().map(function(key_name) {
            return _db.getByKey(key_name);
        }));
    });
}

关于 Promise 兼容性的假设在翻译时消失了,但上面的代码假设 _db.keys() 返回一个数组。如果这个假设不成立,那么代码会略有不同。

fnA 会是这样的:

function fnA() {
    fnB()
        .then((List values) => doSomething(values))
        .catchError((e) => handleError(e));
}

这就是它的本质。您可能需要处理细节。

【讨论】:

  • _db.keys() 返回一个Stream,所以很难从中得到一个List&lt;Future&gt;..
  • @Naddiseo,啊哈,所以它是一个流 - (流是尴尬的恶魔)。在我看来,fnB 的目标是执行_db.keys(),将返回的 Stream 映射到一个数组(期货)并将该数组传递给Future.wait()。从我在 Dart 文档中读到的内容来看,这基本上是正确的,但正如我所说,您可能需要处理细节。
猜你喜欢
  • 2021-11-10
  • 2021-04-07
  • 2020-10-30
  • 2019-11-21
  • 2022-11-15
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多