【问题标题】:autobahn JS, what if RPC's callee is async?autobahn JS,如果 RPC 的被调用者是异步的怎么办?
【发布时间】:2016-10-14 17:48:04
【问题描述】:

autobahnJS 的文档中提供了以下示例来说明如何设置远程过程调用 (RPC):

...
   // 3) register a procedure for remoting
   function add2(args) {
      return args[0] + args[1];
   }
   session.register('com.myapp.add2', add2);

   // 4) call a remote procedure
   session.call('com.myapp.add2', [2, 3]).then(
      function (res) {
         console.log("Result:", res);
      }
   );

 ...

如果 add2 需要做一些异步操作怎么办?我的想法是,也许可以回调在客户端中注册的另一个远程函数,该函数触发了对 backend.add2 的初始调用。像这样的:

...
//backend code
   function add2(args) {
      setTimeout(function() {
         console.log("We are done here");
         session.call('client.added', [123])
      }, 1000);
      return null; // useless, this value is never used
   }
   session.register('backend.add2', add2);

 // client code
   session.call('backend.add2', [2, 3]).then(
      function (res) {
         console.log("Result:", res);
      }
   );

 ...

你有什么更好的选择吗?这对我来说似乎有点麻烦。理想情况下 add2 会返回一个承诺。但我不确定这是否可以通过 RPC 实现?

【问题讨论】:

    标签: javascript asynchronous rpc autobahnjs


    【解决方案1】:

    您可以返回一个承诺,然后在异步函数返回后解决该承诺。

    来自 AutobahnJS API reference page:

    function myAsyncFunction(args, kwargs, details) {
        var d = new autobahn.when.defer();
    
        setTimeout(function() {
           d.resolve("async finished");
        }, 1000);
    
        return d.promise;
    }
    

    【讨论】:

      【解决方案2】:

      我注册异步函数的例子

        session.register('com.forlunch.list_chats', function (args, kwargs, details) {
              return functions.list_chats(args);
          })
      

      查询mysql数据库

      async function list_chats(params){
          var query = "SELECT * WHERE ... ;"
          let res = await mysql_query(query)
          return res
      }
      
      function mysql_query (query){
        return new Promise(function(resolve, reject) {
          const con =  mysql.createConnection(mysql_options);
          con.query(query,[], function (err, rows, fields) {
              if (err) return reject(err);
              resolve(rows);
          });
        })
      }
      

      【讨论】:

      • 欢迎来到 Stack Overflow。在回答问题之前,请确保您阅读了有关如何回答的文档。 stackoverflow.com/help/how-to-answer 最好的答案不只是给出一个解决方案,而是解释为什么这是一个更好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多