簡體   English   中英

如何等待EvaluateJavascript的結果?

[英]How do I await the result of EvaluateJavascript?

我有一個適用於Android的CustomWebViewRenderer,其中包含一個使用EvaluateJavascript處理javascript的事件,並且我有一個Callback對象來捕獲javascript的結果,但是我需要將該結果發送回鏈中,以返回到初始調用函數。 現在,OnRunJavascript在OnRecieveValue運行之前完成,因此e.Result的設置不正確。

public void OnRunJavascript(object sender, JavascriptEventArgs e)
{
    if (Control != null)
    {
            var jsr = new JavascriptResult();
            Control.EvaluateJavascript(string.Format("javascript: {0}", e.Script), jsr);
            e.Result = jsr.Result;
     }
}


            public class JavascriptResult : Java.Lang.Object, IValueCallback
            {
                public string Result;
                public void OnReceiveValue(Java.Lang.Object result)
                {
                    string json = ((Java.Lang.String)result).ToString();
                    Result = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(json);
                    Notify();
                }
            }

一種選擇是將TaskCompletionSource與async / await一起使用。 我之所以喜歡它,是因為它很簡單(相對來說很少的代碼),讓我快速將同步代碼變成看起來像異步代碼的東西。

使用您的示例,我將添加一個TaskCompletionSource並創建一個Task,稍后您的程序中可以將其與await一起使用。

public void OnRunJavascript(object sender, JavascriptEventArgs e)
{
    if (Control != null)
    {
        var jsr = new JavascriptResult();
        Control.EvaluateJavascript(string.Format("javascript: {0}", e.Script), jsr);
        // TODO await jsr.CompletionTask
        e.Result = jsr.Result;
     }
}


public class JavascriptResult : Java.Lang.Object, IValueCallback
{
    public string Result;

    public Task CompletionTask {get { return jsCompletionSource.Task; } }

    private TaskCompletionSource<bool> jsCompletionSource = new TaskCompletionSource<bool>();

    public void OnReceiveValue(Java.Lang.Object result)
    {
        string json = ((Java.Lang.String)result).ToString();
        Result = Newtonsoft.Json.JsonConvert.DeserializeObject<string>(json);
        Notify();
        jsCompletionSource.SetResult(true); // completes the Task
        // the await will finish
    }
}

注意OnRunJavascript中的TODO,我相信這就是您要完成的工作。 該Task可以傳遞到其他地方等待,然后訪問JavascriptResult。

希望對您有所幫助。

暫無
暫無

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

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