我正在使用IndexedDB来存储一些数据.它似乎工作,但如果我刷新页面,我看到:An IndexedDB transaction that was not yet complete has been aborted due to page navigation.
在Firefox(36.0.4)的浏览器控制台中.我正在使用此(本地)文件来测试:
<html>
<head><meta charset="UTF-8"></head>
<body>
<script>
var request = window.indexedDB.open("test_db", 2);
request.onupgradeneeded = function (event) {
request.result.createObjectStore("test_store");
};
request.onsuccess = function (event) {
var db = request.result;
var transaction = db.transaction(["test_store"], "readwrite");
var put = transaction.objectStore("test_store").put("key", "value");
transaction.oncomplete = function (event) {
console.log("Transaction complete");
};
};
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
如果我执行多个事务,我会收到多个错误.如果我有一个onclick
执行事务的处理程序并且我多次单击它,则刷新为我过去做的每个事务打印一个错误.
所有这些让我觉得我的交易没有被清理干净.完成交易需要做什么?
我的oncomplete
处理程序正在调用.刷新几次,浏览器控制台如下所示:
"Transaction complete" test.html:16:1
An IndexedDB transaction that was …
Run Code Online (Sandbox Code Playgroud) 我想编译一些OCaml字节码,让它在Windows和Unix类型的系统上运行.如果我在每个平台上重新编译它,我的源代码工作正常,但字节码不可移植.
示例代码:
open Unix
let on_windows = Filename.dir_sep <> "/";;
Printf.printf "On windows: %b\n" on_windows;;
let child = create_process "gpg" (Array.of_list ["gpg"; "--version"]) stdin stdout stderr;;
Printf.printf "Child %d\n" child;;
Run Code Online (Sandbox Code Playgroud)
构建命令:
ocamlbuild -use-ocamlfind -pkg unix test.byte
Run Code Online (Sandbox Code Playgroud)
如果我在Windows上编译并在Linux上运行,我会得到
Fatal error: unknown C primitive `win_waitpid'
Run Code Online (Sandbox Code Playgroud)
如果我在Linux上编译并在Windows上运行,我得到:
Fatal error: unknown C primitive `unix_waitpid'
Run Code Online (Sandbox Code Playgroud)
如何让字节码到处工作?
我想让i18n使用我的OCaml代码(将短信翻译成用户的首选语言).大多数可翻译字符串是一小组函数之一的第一个非标记参数.例如
print "Feed '%s':" new_feed
raise_safe "Local feed file '%s' does not exist" path
log_warning ~ex "Error checking signature for %s" feed
在GUI代码中,也~label
应该提取参数中的字符串.
有什么方法可以自动提取这些字符串吗?为了使事情变得更有趣,我也使用了一些语法扩展(例如Lwt).
我看到有一个ocaml-gettext包,但是:
f_
,s_
,等).$NAME
),然后也无法卸载,这也表明它没有被大量使用.人们实际使用/推荐什么?
我试图使用的OBU库Lwt_react.这对属性和信号使用"功能反应式编程".
问题(如React文档中所述)是OCaml可能会在您仍在使用它时对您的回调进行垃圾回收.有一个keep
函数,它永远保持处理程序,但我不希望这样.我想最终释放它,而不是在我还需要的时候.
所以,我以为我会将处理程序附加到一个开关:
let keep ~switch handler =
Lwt_switch.add_hook (Some switch) (fun () ->
ignore handler;
Lwt.return ()
)
Run Code Online (Sandbox Code Playgroud)
但是我的事件处理程序无论如何都会被垃圾收集(这是有道理的,因为当信号到达时会调用关闭开关的代码,因此只有信号处理程序才能保持交换机处于活动状态).
这是我的代码的简化(独立)版本:
(* ocamlfind ocamlopt -package react,lwt,lwt.react,lwt.unix -linkpkg -o test test.ml *)
let finished_event, fire_finished = React.E.create ()
let setup () =
let switch = Lwt_switch.create () in
let finished, waker = Lwt.wait () in
let handler () = Lwt.wakeup waker () in
let dont_gc_me = Lwt_react.E.map handler finished_event in
ignore dont_gc_me; (* …
Run Code Online (Sandbox Code Playgroud) 编者注:此代码示例来自 Rust 1.0 之前的版本,在语法上不是有效的 Rust 1.0 代码。此代码的更新版本会产生不同的错误,但答案仍包含有价值的信息。
我在 Rust 0.6 中尝试过这段代码:
fn test<'r>(xs: &'r [&str]) -> &'r str {
return xs[0];
}
Run Code Online (Sandbox Code Playgroud)
我认为这种类型签名的意思是:“test 使用一个借用的指针,生命周期为 'r,指向字符串借用指针的向量,并返回一个指向字符串的借用指针,生命周期也为 'r。但是编译器说:
fn test<'r>(xs: &'r [&str]) -> &'r str {
return xs[0];
}
Run Code Online (Sandbox Code Playgroud)
这似乎意味着向量中的指针可能没有(只读)向量本身那么长。这可能吗?
我需要做一些额外的注释来告诉编译器这是可以的吗?
同样,拥有指针的向量呢?例如
fn test<'r>(xs: &'r [~str]) -> &'r str {
return xs[0];
}
Run Code Online (Sandbox Code Playgroud)
同样,只要我借用了整个列表,我希望能够借用指向向量元素的指针。
对于上下文,我最初的问题是尝试使用拥有的指针列表扩展借用点列表:
fn extend<'r>(xs: ~[&'r str], ys: &'r [~str]) -> ~[&'r str]
Run Code Online (Sandbox Code Playgroud)
计划是:创建一个包含所有借用指针的扩展列表,使用它,然后释放扩展列表,然后释放拥有指针的原始列表,包括包含的字符串。
我经常想要将函数应用于某个变量中的值,以便函数的结果与输入具有相同的类型.如何使类型成功?这是我目前的尝试:
module T : sig
type generic =
[ `Foo of int
| `Bar of int ]
val map : (int -> int) -> ([< generic] as 'a) -> 'a
(* val a : [`Foo of int] *)
end = struct
type generic =
[ `Foo of int
| `Bar of int ]
let map fn = function
| `Foo x -> `Foo (fn x)
| `Bar x -> `Bar (fn x)
let map : (int -> int) -> ([< …
Run Code Online (Sandbox Code Playgroud) 我正在尝试(只是出于兴趣)这样做:
module type CAT = sig
type ('a, 'b) t
val id : ('a, 'a) t
val (@) : ('b, 'c) t -> ('a, 'b) t -> ('a, 'c) t
end
module Lst = struct
type ('a, 'b) t = 'a list constraint 'a = 'b
let id = []
let (@) = (@)
end
module L : CAT = Lst (* (error) *)
Run Code Online (Sandbox Code Playgroud)
但我得到:
Type declarations do not match:
type ('b, 'a) t = 'b list constraint 'a = …
Run Code Online (Sandbox Code Playgroud)