0

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 経由で可能かどうかはわかりません。

4

2 に答える 2

1

非同期関数が返されると解決される promise を返すことができます。

AutobahnJS API リファレンス ページから:

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

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

    return d.promise;
}
于 2016-10-15T11:19:26.193 に答える