【问题标题】:How to call continuations in Rhino?如何在 Rhino 中调用延续?
【发布时间】:2015-05-26 03:22:30
【问题描述】:

我正在尝试在 Rhino 中使用延续,但我发现如何做到这一点的说明不一。我想在 JS 中适当地创建和使用延续。

https://developer.mozilla.org/en-US/docs/New_in_Rhino_1.7R2#Java_API.C2.A0for_Continuations

以处理异常的形式展示了如何在 Java 中使用它们(我认为这是错误的看待方式)。

http://wiki.apache.org/cocoon/RhinoWithContinuations

显示了一种现已弃用的使用方式 - 不再允许显式创建延续。

谁能澄清一下?我现在可以使用 1.7R2 发行说明中的​​ 4 种方法仅通过 Java 端操作来创建带有 Rhino 的 JS 延续吗?

【问题讨论】:

  • 这是我前段时间写的一个问答。我不确定这是否使用了您现在引用的已弃用的功能,但它对我来说效果很好。如果是这样的话,它可能仍然值得使用旧版本,除非它被弃用是有充分理由的。 stackoverflow.com/questions/8616512/…
  • 谢谢乔希!不久前我已经偶然发现了您的博客文章,它确实帮助了我!
  • 不客气。很高兴它有帮助。 :)

标签: javascript rhino continuations


【解决方案1】:

已经有一段时间了,但我已经解决了,所以最好写下来。

Rhino 中的Continuation 处理仅是Java 端的——您可以通过运行一个支持Continuations 的函数进入JS,并在您抛出一个ContinuationPending 异常或调用抛出它的Java 代码时从Javascript 代码返回Java。您返回到 Java 代码中的问题。

这段代码开始执行一个支持 Continuations 的函数 - 进入 Javascript。

try {
    openGlobalContext();
    _globalContext.callFunctionWithContinuations(_func, _scope,
        new Object[0]);
} catch (ContinuationPending pending) {
    _cont = pending;
} finally {
    closeGlobalContext();
}

这段 Java 代码,当 from 被解释的 Javascript 调用时,“走出” Javascript 代码到延续异常的地方被抛出。也就是说,SomeMoreCode() 将运行。

public void createContinuation(){
    try {
        openGlobalContext();
        ContinuationPending pending =
            _globalContext.captureContinuation();
        throw pending;
    } finally {
        closeGlobalContext();
    }
    SomeMoreCode();
}

【讨论】:

    猜你喜欢
    • 2017-04-26
    • 2011-02-10
    • 2012-03-29
    • 2019-09-11
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    相关资源
    最近更新 更多