当我发现我必须从内部函数中返回外部函数值时,我在dart中编写了一个从浏览器端索引数据库中删除对象的函数:
Future<bool> delete() {
Transaction tx = db.transactionStore(storeName, "readwrite");
ObjectStore os = tx.objectStore(storeName);
os.delete(_key); // returns blank future, modifies tx
// This is not correct, but shows the idea:
if (tx.onComplete) {return true;}
if (tx.onError) {return false;}
}
Run Code Online (Sandbox Code Playgroud)
此函数是我用于保存和加载到索引数据库的类的方法.当删除操作成功或失败时,我希望此函数返回true或false包含相同的Future对象.但是,瓶颈是os.delete(_key);声明:它返回一个未来,但删除操作的实际成功或失败由tx.onComplete和提供tx.onError.这两个对象都是流,所以我需要创建处理来自它们的事件的匿名函数:
tx.onComplete.listen((e){
return_to_outer_function(true);
});
tx.onError.listen((e){
return_to_outer_function(false);
});
return_to_outer_function(bool) {
return bool; // doesn't work
}
Run Code Online (Sandbox Code Playgroud)
如您所见,当我创建匿名函数时,return语句不再完成方法,而是内部函数.我可以让内部函数调用其他函数,但那些其他函数有自己的return语句,它们不会将结果返回给整个方法.
我尝试了设置临时变量并定期检查它们的方法,但这是一个非常不优雅的解决方案,我不想使用,不仅仅是潜在的错误,而是因为它会占用单线程事件循环.
是否可以从内部函数返回值到外部函数?或者是否有其他更好的方法从一组流中存在或不存在事件中获取值?或者是否有另一种方法可以使用IndexedDB来避免这个问题?
谢谢你看我的问题。
在此 javascript 初始化代码中,在第 94 行,我收到一个语法错误:“此上下文中不允许出现重复的参数名称”。但是,我没有复制任何参数。我的所有函数的参数名称在其范围内都是唯一的。
存储库位于https://github.com/allenchan3/foodproject/blob/c3442a3b8542e1f9cbcc5f3f78175765a292dd9a,有问题的脚本位于https://github.com/allenchan3/foodproject/blob/c3442a3b856dc72a2a3b8573dcc2a3b8563728cc2a3b8573dcc78cs . 错误出现在对 的函数调用中create_menu_items。我仔细检查了这个文件中是否有重复的参数名称,但没有发现。我尝试更改主函数中 3 个声明变量中的每一个的名称,以及更改参数的名称。似乎没有什么可以消除语法错误,这阻止了我的函数执行。
async function create_menu_items(filenames, directory, cat_names_to_ids) {
/// stuff
}
async function main() {
await create_menu_items(menu_item_filenames, menu_item_dir, categories_name_to_id);
}
[skyler@laptop server]$ npm start
[.....snip.....]
(node:6571) UnhandledPromiseRejectionWarning: SyntaxError: Duplicate parameter name not allowed in this context
Run Code Online (Sandbox Code Playgroud)
如前所述,这个错误不断出现并且函数create_menu_items没有运行,即使我认为它应该运行,因为没有一个参数似乎与任何东西冲突。
再次感谢您的观看。