Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何等待EvaluateJavascript的结果?_Javascript_C#_Xamarin_Xamarin.android - Fatal编程技术网

我如何等待EvaluateJavascript的结果?

我如何等待EvaluateJavascript的结果?,javascript,c#,xamarin,xamarin.android,Javascript,C#,Xamarin,Xamarin.android,我有一个用于Android的CustomWebViewRenderer,它包含一个使用EvaluateJavascript处理javascript的事件,我有一个回调对象来捕获javascript的结果,但我需要将该结果发送回初始调用函数的链。现在OnRunJavascript在OnReceiveValue运行之前完成,所以e.Result设置不正确 public void OnRunJavascript(object sender, JavascriptEventArgs e) { i

我有一个用于Android的CustomWebViewRenderer,它包含一个使用EvaluateJavascript处理javascript的事件,我有一个回调对象来捕获javascript的结果,但我需要将该结果发送回初始调用函数的链。现在OnRunJavascript在OnReceiveValue运行之前完成,所以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();
                }
            }
public void OnRunJavascript(对象发送方,JavascriptEventArgs e)
{
if(控件!=null)
{
var jsr=newJavaScriptResult();
EvaluateJavascript(string.Format(“javascript:{0}”,e.Script),jsr);
e、 Result=jsr.Result;
}
}
公共类JavascriptResult:Java.Lang.Object,IValueCallback
{
公共字符串结果;
public void OnReceiveValue(Java.Lang.Object结果)
{
字符串json=((Java.Lang.string)结果).ToString();
结果=Newtonsoft.Json.JsonConvert.DeserializeObject(Json);
通知();
}
}

一个选项是将TaskCompletionSource与async/await一起使用。我喜欢这一点,因为它很简单(代码相对较少),让我们快速地将同步代码转换为类似异步代码的代码

使用您的示例,我将添加一个TaskCompletionSource并创建一个任务,该任务可在以后的程序中与Wait一起使用

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
    }
}
public void OnRunJavascript(对象发送方,JavascriptEventArgs e)
{
if(控件!=null)
{
var jsr=newJavaScriptResult();
EvaluateJavascript(string.Format(“javascript:{0}”,e.Script),jsr);
//TODO等待jsr.CompletionTask
e、 Result=jsr.Result;
}
}
公共类JavascriptResult:Java.Lang.Object,IValueCallback
{
公共字符串结果;
公共任务CompletionTask{get{return jsCompletionSource.Task;}}
私有TaskCompletionSource jsCompletionSource=新TaskCompletionSource();
public void OnReceiveValue(Java.Lang.Object结果)
{
字符串json=((Java.Lang.string)结果).ToString();
结果=Newtonsoft.Json.JsonConvert.DeserializeObject(Json);
通知();
jsCompletionSource.SetResult(true);//完成任务
//等待将结束
}
}
请注意OnRunJavascript中的TODO,我相信这就是您希望实现的目标。该任务可以传递到其他地方等待,然后访问JavascriptResult


我希望这能有所帮助。

很抱歉听起来很无知,但什么是待办事项?一点也不用担心。:)TODO只是表示在代码工作之前还有一些工作要做。这是留给读者“去做”的事情。