私は継続をキャプチャして、それを数回再開できるようにしています。そのようなそれぞれの呼び出しは他と独立しています。Rhinoで継続を複数回再開することはできますか?
たとえば、次のコードでは、私は出力をもたらすためにrun
方法でcontext.resumeContinuation
への2つの呼び出しをしたいと思います:1 1
、というよりも1 2
の電流出力を。
私が理解する限り、結果として得られる出力の理由は、常に同じscope
オブジェクトを使用することです。このオブジェクトは、最初の継続によって修正されてから2番目のものに変更されます。だから、私はコピー元scope
のと各継続を再開すべきであると思われますが、タイプScriptable
にはclone
メソッド(または同等のもの)を持っていない、とシリアライズ/デシリアライゼーションのを使用して、それをコピーすることはどちらか助けていません。
P.S.私はRhinoバージョン1.7R5を使用しています。
Example.java:
import org.mozilla.javascript.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Example {
public void run() throws IOException {
Context context = Context.enter();
context.setOptimizationLevel(-2); // Use interpreter mode.
Scriptable scope = context.initStandardObjects();
scope.put("javaProxy", scope, Context.javaToJS(this, scope));
Object capturedContinuation = null;
try {
String scriptSource =
new String(Files.readAllBytes(Paths.get("example.js")));
String scriptName = "example";
int startLine = 1;
Object securityDomain = null;
Script script =
context.compileString(scriptSource, scriptName, startLine, securityDomain);
context.executeScriptWithContinuations(script, scope);
} catch (ContinuationPending continuationPending) {
capturedContinuation = continuationPending.getContinuation();
}
Object result = "";
context.resumeContinuation(capturedContinuation, scope, result);
context.resumeContinuation(capturedContinuation, scope, result);
Context.exit();
}
public void captureContinuation() {
Context context = Context.enter();
ContinuationPending continuationPending =
context.captureContinuation();
Context.exit();
throw continuationPending;
}
public void print(int i) {
System.out.print(i + " ");
}
public static void main(String[] args) throws IOException {
new Example().run();
}
}
example.js:、
代わりのscope
オブジェクトをコピーする:
var i = 1;
javaProxy.captureContinuation();
javaProxy.print(i);
i = i + 1;