从没有回调的async javascript方法获得结果

时间:2017-07-14 10:13:17

标签: javascript c# asynchronous

我有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(); ?

1 个答案:

答案 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