如何在飞镖中执行此jquery模式?

时间:2014-05-08 23:08:21

标签: javascript jquery dart promise dart-async

我正在尝试将以下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();
}

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

(我正在使用lawndart作为数据库)

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

2 个答案:

答案 0 :(得分: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));
  });
}

答案 1 :(得分:0)

坚持使用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));
}

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