autobahn JS, а что, если вызывающа¤ сторона RPC будет асинхронной?

¬ документации по 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 необходимо выполнить некоторую операцию async? ћо¤ иде¤ заключалась в том, что, возможно, можно было бы перезвонить другую удаленную функцию, зарегистрированную на клиенте, котора¤ вызвала первоначальный вызов 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,

0

Ответов: 2


1 прин¤т

¬ы можете вернуть обещание, которое затем будет разрешено, как только функци¤ async вернетс¤.

Ќа странице справки AutobahnJS API :

function myAsyncFunction(args, kwargs, details) {
    var d = new autobahn.when.defer();

    setTimeout(function() {
       d.resolve("async finished");
    }, 1000);

    return d.promise;
}

0

ћой пример регистрации функции async

  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);
    });
  })
}
JavaScript, асинхронный, ѕ –, autobahnjs,
Похожие вопросы