簡體   English   中英

我如何知道Rhino中異步JavaScript執行何時完成

[英]How do I know when asynchronous JavaScript execution complete in Rhino

我有一個JavaScript代碼,該代碼調用了一些異步API,並且效果很好。 但是我還需要調用其他API來在腳本執行完成時報告。 問題在於Context.evaluateString(...)立即返回,但是腳本代碼由於其異步特性而繼續執行。 JS范例:

function f1(function (err, res) {
  function f2(function (err, res) {
    function f3(function (err, res) {
      handleResult(err, res);
      // ideally I need to know when handleResult(...) has completed execution
      // but Rhino's Context.evaluateString(...) returns immediately
      // after f1() is called, but script continues execution
    });
  });
});

是的,我可以在腳本中添加一些方法,以在所有操作完成后從腳本中調用它,並在Java端進行處理,但這將迫使我每次都調用它。 這只是解決方法。 但是我需要一種更通用的方法,而不是對腳本代碼應用任何規則。 另外,如果客戶忘記從腳本中調用sendResult()怎么辦? 另一邊的應用程序將永遠等待結果。 所以我需要防彈解決方案。

在iOS中,使用javascriptcore只是在添加到銷毀腳本引擎頂級對象時做出反應,但是在Java中,此技巧不起作用,因為與Objective-C / Swift不同,Java不是引用計數,而是使用GC,並且您永遠不知道何時對象將被釋放。

我沒有使用Rhino的經驗,因此請帶着一粒鹽來回答這個問題。 但是,此答案可能會引導您朝正確的方向發展。

文檔指出:

EvaluationString

...

返回值:

評估字符串的結果

因此,我將創建一個由JavaScript返回的Future 執行handleResult后解決將來的問題。 然后在Java方面,只需將結果強制轉換為正確的對象,然后等待該值被解析即可。

// create an empty task
const future = new java.util.concurrent.FutureTask(function () {});

f1(function (err, res) {
  f2(function (err, res) {
    f3(function (err, res) {
      handleResult(err, res);

      // run the empty task, doing nothing more than resolving the future
      future.run();
    });
  });
});

// return future to evaluateString
future;

你可以找到關於JavaScript中的Java對象的詳細信息在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM