Автоматическая привязка CefSharp.BindObjectAsync в IRenderProcessMessageHandler:OnContextCreated

#javascript #c# #promise #cefsharp

#javascript #c# #обещаю #cefsharp

Вопрос:

используя CefSharp, я пытаюсь автоматически ввести связанный объект в IRenderProcessMessageHandler:OnContextCreated метод, но, думаю await , отсутствует:

 _chromeProxy = new ChromeProxy();
chromiumWebBrowser1.RenderProcessMessageHandler = new RenderProcessMessageHandler();
chromiumWebBrowser1.JavascriptObjectRepository.ObjectBoundInJavascript  = (mysender, mye) =>
    {
       var name = mye.ObjectName;
       Console.WriteLine($"Object {mye.ObjectName} was bound successfully."); //Gets triggered
    };
chromiumWebBrowser1.JavascriptObjectRepository.Register("App", new ChromeProxy(),  true);
 

и OnContextCreated метод:

 public void OnContextCreated(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame)
        {
            // Does bind but too late ( no await )
            const string script = "CefSharp.BindObjectAsync('App');";
            frame.ExecuteJavaScriptAsync(script); 

            // ERR: Uncaught SyntaxError: await is only valid in async function
            // const string script = "await CefSharp.BindObjectAsync('App');";
            // frame.ExecuteJavaScriptAsync(script);          
        }
 

Возможно ли зарегистрировать связанный объект с помощью этого подхода, и если да, то как я могу дождаться результата привязки до выполнения Javascript на странице?

Комментарии:

1. Если был запущен ObjectBoundInJavascript, то ваш объект был привязан. Вам не нужно вызывать await, если вам не нужно выполнять некоторые функции для вашего объекта. Вы можете использовать iife, если вам нужно вызвать await, а затем выполнить JavaScript, см. github.com/cefsharp/CefSharp/wiki /… для некоторых примеров iife. Или используйте postMessage, если вам просто нужна простая передача сообщений github.com/cefsharp/CefSharp/issues/2775

Ответ №1:

благодаря @amaitland у меня получилось:

ключ должен был использоваться EvaluateScriptAsync вместо ExecuteJavaScriptAsync следующего iife

 frame.EvaluateScriptAsync(@"(async function() {await CefSharp.BindObjectAsync('App');})();");