2016-10-14 9 views
0

В документации autobahnJS предусмотрен следующий пример, чтобы проиллюстрировать, как сделать настроить удаленный вызов процедур (RPC):autobahn JS, а что, если вызываемый 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

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

От 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; 
} 
0

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

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

Добро пожаловать на переполнение стека. Прежде чем отвечать на вопрос, убедитесь, что вы прочитали документы о том, как ответить. https://stackoverflow.com/help/how-to-answer Лучшие ответы не только дают решение, но и объясняют * почему * это лучшее решение. –