如何等待EvaluateJavascript的结果? - javascript

我有一个适用于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,稍后可在您的程序中使用它。

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。

希望对您有所帮助。

Javascript IF语句 - javascript

                        嗨,我有这段代码可以正常工作,并将两个日历显示为一个日历。我还有一个php变量$login_session,其中包含登录电子邮件地址的用户。关于如何显示[email protected]日历的任何想法(伪代码)IF $login_session == "[email protected]&#…

如何根据手势滚动网页 - javascript

如何使用pyhton / javascript使用手势向上/向下或向左/向右滚动页面。我尝试了很多找到解决方案,但无法解决。 参考方案 Javascript手势插件(JSHG)是一个很棒的插件,它使您可以通过现有网站或Web应用程序中的网络摄像头来支持用户的手势识别。您无需具有计算机视觉的任何背景即可使用此插件。当前,它提供了一组基本的手势,其中包括手的位置…

从一个脚本到另一个脚本的统一变量访问 - javascript

所以我有一个统一的3D文本上的文本网格脚本,我希望它从具有OnMouseDown函数的多维数据集中访问一个变量,在该函数内部它会更改分数,并且我希望将该分数输出到文本。当我在CS中编写文本脚本时,多维数据集脚本是用JavaScript编写的。谁有想法? 参考方案 如果我误解了您的问题,请纠正我。选项1:C#代码在js代码之前进行编译,这意味着您无权从c#代码…

在文本字段中键入时显示预制建议列表 - javascript

如标题所说我正在处理一个mysql项目,我希望该文本字段在键入它时向现有用户提供建议(管理员控制页以禁止用户..类似的东西)一个简单的例子来解释:当我输入文字时..我想给用户输入建议假设他正在输入颜色名称所以当他在其中输入b在他继续之前,会出现一个列表,向他提供我们预先设定的建议,例如:黑色棕色蓝色然后如果他输入l为bl该列表将是:黑色蓝色布拉布拉有什么建议…

什么是最好的免费JavaScript模糊处理程序,可以作为javascript库或python库使用 - javascript

我关注这篇文章:Free JavaScript obfuscators?找到一个JavaScript混淆器,可以帮助我在客户端混淆一些JavaScript数据。但我发现这些选择都不是python或javascript lib,they use java,我使用django,所以我想知道,最好的免费JavaScript混淆器是javascript库或pytho…