0

次の 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;
             });
        });
    });
}
4

2 に答える 2

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

それが本質です。細かい作業が必要な場合があります。

于 2014-05-09T01:14:55.540 に答える