我有javascript函数,它使用CefSharp.ChroniumBrowser(WinForms)。 我将“jsObject”注册为浏览器的脚本对象:Browser.RegisterJsObject(new JsObject())。 C#代码:
public class JsObject
{
//...
public async void IsServerConnected(IJavascriptCallback callback)
{
var result = await Server.GetConnectionResult();
callback.ExecuteAsync(result);
}
}
以下js代码调用C#方法,该方法异步检查服务器是否已连接并执行带有结果的回调。
function isServerConnected(callback) {
window.jsObject.isServerConnected(function (connected) {
callback(connected);
});
}
并得到我应该写的结果:
isServerConnected(function(result) {
if (result) {
// server is connected. do something
} else {
// show error
}
});
我想以这样的方式得到结果:
var result = isServerConnected();
if (result){
...
} else {
...
}
是否有可能使这项工作?也许promises应该有帮助,但是如何在结束调用中不使用回调来获得结果:var result = isServerConnected(); ?
答案 0 :(得分:1)
当我们使用异步调用时,JS代码不会同步执行。 JS对同步和异步调用非常透明。如果您不喜欢在ES6中引入Promises
的回调,那么您可以更好地处理异步调用。看一下下面的代码
var promise = new Promise(function(resolve, reject) {
window.jsObject.isServerConnected(function(connected) {
resolve(connected);
});
});
promise.then(function(result) {
if(result) {
// server is connected. do something
} else {
// show error
}
}).catch(function(error) {
// catch all errors here
});
许多浏览器尚未添加对Promises
的支持。检查浏览器兼容性here。在ES7中,我们有async/await
,它可以按预期工作。同样,它还没有被许多浏览器添加。有关async/await
的更多信息,请查看here。