小编Tho*_*ard的帖子

"由于页面导航,尚未完成的IndexedDB事务已中止"

我正在使用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)

javascript firefox indexeddb

12
推荐指数
1
解决办法
1001
查看次数

如何制作适用于Windows和Linux的OCaml字节码

我想编译一些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)

如何让字节码到处工作?

ocaml

9
推荐指数
2
解决办法
1377
查看次数

OCaml中的Gettext支持

我想让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_,等).
  • OPAM说没有用它.
  • 它无法安装(必须首先取消设置$NAME),然后也无法卸载,这也表明它没有被大量使用.

人们实际使用/推荐什么?

ocaml gettext internationalization

9
推荐指数
1
解决办法
206
查看次数

如何阻止OCaml垃圾收集我的被动事件处理程序?

我试图使用的OBULwt_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)

ocaml garbage-collection reactive-programming ocaml-lwt

8
推荐指数
1
解决办法
781
查看次数

借用向量的生命周期与其包含的借用指针之间的关系是什么?

编者注:此代码示例来自 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)

计划是:创建一个包含所有借用指针的扩展列表,使用它,然后释放扩展列表,然后释放拥有指针的原始列表,包括包含的字符串。

rust rust-obsolete

5
推荐指数
1
解决办法
2265
查看次数

映射多态变体的子集

我经常想要将函数应用于某个变量中的值,以便函数的结果与输入具有相同的类型.如何使类型成功?这是我目前的尝试:

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)

ocaml

5
推荐指数
1
解决办法
387
查看次数

为什么我在实现模块类型时不能添加类型约束?

我正在尝试(只是出于兴趣)这样做:

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)

ocaml type-constraints

4
推荐指数
2
解决办法
393
查看次数