我正在尝试与 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)
因此,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)
| 归档时间: |
|
| 查看次数: |
1699 次 |
| 最近记录: |