autobahn JS,如果 RPC 的被调用者是异步的怎么办?
Posted
技术标签:
【中文标题】autobahn JS,如果 RPC 的被调用者是异步的怎么办?【英文标题】:autobahn JS, what if RPC's callee is async? 【发布时间】: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 实现?
【问题讨论】:
【参考方案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。在回答问题之前,请确保您阅读了有关如何回答的文档。 ***.com/help/how-to-answer 最好的答案不只是给出一个解决方案,而是解释为什么这是一个更好的解决方案。以上是关于autobahn JS,如果 RPC 的被调用者是异步的怎么办?的主要内容,如果未能解决你的问题,请参考以下文章
null 传递给在 Xcode 7 中需要非 null 参数的被调用者