Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart indexed_db getObject()-如何返回结果_Dart - Fatal编程技术网

Dart indexed_db getObject()-如何返回结果

Dart indexed_db getObject()-如何返回结果,dart,Dart,我想知道如何定义数据类型以及如何使用getObject()返回对象(记录)。目前,我能够在获得结果的函数之外使用该结果(记录)的唯一方法是使用该结果调用另一个函数。这样,就不需要指定数据类型。但是,如果我想返回值,我需要定义数据类型,但我找不到它是什么。我尝试了“动态”,但似乎不起作用。例如: fdbselectioneclient(字符串sKey、函数fSuccess、字符串sErmes){ 试一试{ idb.Transaction oDbTxn=ogDb1.Transaction(sgTbl

我想知道如何定义数据类型以及如何使用getObject()返回对象(记录)。目前,我能够在获得结果的函数之外使用该结果(记录)的唯一方法是使用该结果调用另一个函数。这样,就不需要指定数据类型。但是,如果我想返回值,我需要定义数据类型,但我找不到它是什么。我尝试了“动态”,但似乎不起作用。例如:

fdbselectioneclient(字符串sKey、函数fSuccess、字符串sErmes){
试一试{
idb.Transaction oDbTxn=ogDb1.Transaction(sgTblClient,'readwrite');
idb.ObjectStore oDbTable=oDbTxn.ObjectStore(sgTblClient);
idb.Request oDbReqGet=oDbTable.getObject(sKey);
oDbReqGet.onSuccess.listen((val){
if(oDbReqGet.result==null){
window.alert(“未找到记录$sKey-$sErmes”);
}否则{
///////return oDbReqGet.result;///这就是我想要做的
fsucces(oDbReqGet.result);///这就是我必须要做的
}});
oDbReqGet.onError.first.then((e){window.alert(
“读取单个客户端时出错。Key=$sKey.Error=${e}”);});
}捕获(错误){
window.alert(“尝试读取客户端$sKey的记录时出错。
错误=${oError}”);
}
}
fAfterAddOrUpdateClient(oDbRec){
///这是上面用作“fSuccess”的函数之一
正如其他人曾经说过的(不记得是谁),一旦开始使用异步API,一切都需要异步

要做到这一点,典型的“省道”模式是使用
未来
+
完成符
对(尽管您在上面的问题中所做的没有本质上的错误-这更像是一个风格问题…)

从概念上讲,
fdbselectioneclient
函数创建一个completer对象,该函数返回
completer.future
。然后,当异步调用完成时,调用
completer.complete
,传入值

函数的用户将调用
fdbselectioneclient(…)。然后((结果)=>print(结果));
以异步方式使用结果

您的上述代码可以重构如下:

导入'dart:async';//完成程序需要
未来的FDBSelectionClient(字符串sKey){
var completer=new completer();
试一试{
idb.Transaction oDbTxn=ogDb1.Transaction(sgTblClient,'readwrite');
idb.ObjectStore oDbTable=oDbTxn.ObjectStore(sgTblClient);
idb.Request oDbReqGet=oDbTable.getObject(sKey);
oDbReqGet.onSuccess.listen((val)=>completer.complete(oDbReqGet.result));
oDbReqGet.onError.first.then((err)=>completer.completeError(err));
} 
捕获(错误){
完成者。完成者错误(oError);
}
return completer.future;//返回未来
}
//在别处调用代码
foo(){
var key=“Mr Blue”;
FDBSelectionClient(密钥)
.然后((结果){
//对结果执行某些操作(注意,可能为空)
})
…catchError((err){//注意方法链接。。
//做错事
};
}
这个future/completer对只适用于一次(即,如果多次调用
onSuccess.listen
,那么第二次您将得到一个“future ready completed”错误。(我根据函数名
fDbSelectOneClient
假设您只希望选择一条记录

要多次从单个未来返回值,您可能必须使用未来的新流功能-有关更多详细信息,请参阅此处:

另外请注意,期货和补全符支持泛型,因此您可以按如下方式强键入返回类型:

//强类型future
未来的FDBSelectionClient(字符串sKey){
var completer=new completer();
completer.complete(新的SomeReturnType());
}
foo(){
//强类型结果
FDBSelectionClient(“蓝色先生”)。然后((SomeReturnType结果)=>打印(结果));
}

谢谢Chris,我很快会详细查看您的回复,这将有助于我更好地理解事情。完成后,我会打勾。