我正在尝试将以下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;
});
});
});
}
答案 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));
}
这就是它的本质。您可能需要处理细节。