在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?
答案 0 :(得分: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;
}
答案 1 :(得分:0)
我注册异步功能的例子
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);
});
})
}
查询mysql数据库
/**
* @param post_id can use 'get_the_ID()'
* @param taxonomy for example 'category'
*/
$terms = wp_get_object_terms($post_id, $taxonomy, array('parent'=>'0'));
foreach($terms as $term) {
?>
<a href="<?php echo get_term_link($term->term_id); ?>"><?php echo $term->name; ?></a>
<?php
}