EvaulateScriptAsPromiseAsync 和 async/await

Pet*_*win 2 cefsharp

我正在尝试与 CefSharp 一起使用EvaluateScriptAsPromiseAsync

它似乎在浏览器中工作,但我在 cefSharp 中得到空结果。

JavaScript:

(async function() {
    const result = await $.ajax({ type: 'GET', url: './robots.txt' });
    return result;
})();
Run Code Online (Sandbox Code Playgroud)

CSharp代码:

var result = await browser.EvaluateScriptAsPromiseAsync(script);
Debug.Assert(result.Result != null);
Run Code Online (Sandbox Code Playgroud)

完整代码:


public partial class Form1 : Form
    {
        ChromiumWebBrowser browser;
        public Form1()
        {
            InitializeComponent();
            browser = new ChromiumWebBrowser("jquery.com");
            this.Controls.Add(browser);

            browser.FrameLoadEnd += Browser_FrameLoadEnd;

        }

        private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
        {
            const string script = @"(async function() {
                const result = await $.ajax({ type: 'GET', url: './robots.txt' });
            return result;
        })();";
            if (e.Frame.IsMain)
            {
                // Get us off the main thread
                Task task = new Task(async () =>
                {
                    var result = await browser.EvaluateScriptAsPromiseAsync(script);
                    Debug.Assert(result.Result != null);
                });
                task.Start();
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

ama*_*and 5

因此,IIFE上面示例中的 评估为 a Promise,所需的额外步骤是实际返回承诺。传递给的脚本EvaluateScriptAsPromiseAsync 必须返回一个值,否则您将得到 null。

与其他 EvaluateScriptAsync 方法的不同之处在于您必须返回结果。

//This will return 42
await browser.EvaluateScriptAsPromiseAsync("return 42");
//This will return undefined
await browser.EvaluateScriptAsPromiseAsync("42");
Run Code Online (Sandbox Code Playgroud)

根据https://github.com/cefsharp/CefSharp/pull/3251

因为它被包装在 an 中IIFE,然后传递给Promise.resolve,所以您需要返回结果。例如

//This will return 42
await browser.EvaluateScriptAsPromiseAsync("return 42");
//This will return undefined
await browser.EvaluateScriptAsPromiseAsync("42");
Run Code Online (Sandbox Code Playgroud)
return (async function() {
    const result = await $.ajax({ type: 'GET', url: './robots.txt' });
    return result;
})();
Run Code Online (Sandbox Code Playgroud)