2016-05-26 3 views
0

я пытаюсь получить простое значение с моего сервера узла следующим образом:возвращаемого значения из двойной вложенной функции

getNodeServerValue = function()  { 
    return io.socket.emit('server-Query', 
     function(data) { 
       console.log('data is now: ' + data); // works fine! 
       return (data); 
     } 
    ); 
} 

и я хочу, чтобы иметь возможность получить значение, как это:

var myReturnedValue = getNodeServerValue(); 

, но receivedValue содержит функцию, а не возвращаемое значение. и getNodeServerValue()() тоже не работает.

Я попытался вернуть переменную, setTimeout, clearTimeout и т. Д. Без успеха из-за асинхронного характера jScript.

этот пример свободно на основе «Отправка и получение данных (подтверждения приема» пример в socket.io docs.

ищет here и here не помог мне, так как мои требования двойной вложенной, а также я должен назвать getNodeServerValue с переменной.

я уверен, что это простой вопрос, поэтому, пожалуйста, не вниз голосовать меня без объяснения причин.

большое спасибо.

+2

вы не можете вернуть данные, потому что он не будет доступен к моменту возвращения вашей функции. Вам нужно использовать обратные вызовы: http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call – juvian

+1

Вы должны использовать обещания. –

ответ

1

Вы можете использовать библиотеку обещание, или если в узле они поддерживаются изначально

io.getNodeServerValue = new Promise(function (resolve, reject) { 
    io.socket.emit('server-Query', 
     function(data) { 
       resolve(data); 
     } 
    ); 
}); 

использовать его так:

io.getNodeServerValue.then(function (data) { 
    // data is here! 
}); 
+0

ваше предлагаемое решение будет «инициализироваться», когда клиент узла сначала подключится, но после этого функция не будет выполнена. есть ли способ убедиться, что функция запускается каждый раз, а не только при подключении сокета? – edwardsmarkf

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