2015-02-16 5 views
0

В моем приложении рекурсивная функция вызывает удаленный одноранговый узел для некоторых данных, а затем снова вызывает себя. Есть ли способ ждать ответа от сервера, а затем продолжить поток выполнения?Последовательное выполнение в javascript над сетью

Я использую Simple-Peer для удаленных вызовов.

function foo() { 
    data = getFromPeer(); 
    if(condition) 
     foo(); 
    else return bar; 
} 

getFromPeer является пользователем функцией, которая отправляет данные на удаленные узлы, используя SimplePeer соединение. Удаленный одноранговый узел отвечает, когда он получает запрос. На данный момент никаких обещаний или обратных вызовов нет.

+0

Не могли бы вы поделиться им? –

+0

Поскольку мы не знаем вашу функцию getFromPeer(), лучше всего я могу представить, установить значение данных по умолчанию. запустите цикл и подождите, пока не изменится его значение или не появится ожидаемое значение. Имейте в виду, чтобы максимально подождать. В противном случае, он может застрять навсегда. –

ответ

0

В документации к https://github.com/feross/simple-peer не существует стандартного способа выполнения «Удаленных вызовов процедур» или получения подтверждения того факта, что некоторые данные, которые были ранее отправлены, были фактически получены.

Итак, чтобы достичь того, чего вы хотите достичь с помощью простого однорангового устройства, вам нужно добавить пользовательский «протокол» по каналу простого однорангового канала. Поскольку у вас нет гарантии над заказом, в котором удаленный одноранговый узел получит ваши сообщения, вам необходимо указать идентификатор для каждого сообщения.

что-то подобное в псевдокоде (и учитывая, что peer является связным простой сверстников)

pendingJobs = {} 
function addJob(data, callback) { 
    var id = uuid() // imagine a function giving a uuid 
    pendingJobs[id] = callback 
    peer.send({ id: uuid, payload: data }) 
} 
peer.on('data', function(info) { 
    var id = info.id 
    var cb; 
    if (pendingJobs[id] && info.payload) { 
     cb = pendingJobs[id] 
     cb(info.payload) 
    } 
}) 

Конечно, это псевдо-код решение очень грубо, и вы, вероятно, потребуется добавить вывоз мусора pendingJobs, имеют обратные вызовы ошибок, если удаленный одноранговый узел никогда не отправляет сообщение ACK.

Вы можете добавить тип для каждого сообщения ('rpc', 'ack', ..)

Смежные вопросы