![](/img/trans.png)
[英]Are all javascript callbacks asynchronous? If not, how do I know which are?
[英]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.