高速公路JS,如果rpc调用是异步的

autobahn JS, what if RPC's callee is async?

本文关键字:异步 调用 rpc JS 如果 高速公路      更新时间:2023-09-26

在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将返回一个promise。但我不确定这是否可能通过RPC?

你可以返回一个promise,然后在async函数返回时解析它。

来自AutobahnJS API参考页:

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

注册异步函数的例子

  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);
    });
  })
}