LINUX.ORG.RU

JavaScript - объясните, что происходит

 


0

1

Есть ip.js

var net = require('net');

function getNetworkIP(callback) {
  var socket = net.createConnection(80, 'www.google.com');
  socket.on('connect', function() {
    callback(undefined, socket.address().address);
    socket.end();
  });
  socket.on('error', function(e) {
    callback(e, 'error');
  });
}

exports.getNetworkIP = getNetworkIP;

Подключаю, вызываю:

var addr;
ip.getNetworkIP(function (error, addr) {
    console.log('inner: ' + addr);
    if (error) {
        callback(e, 'error');
    }
});
console.log('ip: ' + addr);
Получаю:

ip: undefined
inner: 192.168.21.94

Помогите понять, как сохранить ip в переменной. Заранее благодарен.


var addr;
//...
console.log('ip: ' + addr);

В этой области видимости ей не присвоено значение.

var addr;

ip.getNetworkIP(function (error, innerAddr) {
    console.log('inner: ' + innerAddr);
    addr = innerAddr;
    if (error) {
        callback(e, 'error');
    }
});
console.log('ip: ' + addr);

Хотя это вряд ли будет полезно, поскольку неизвестно, когда переменная получит значение. Здесь нужно колбек использовать.

metrokto ★★
()
Последнее исправление: metrokto (всего исправлений: 1)

В дополнение к тому, что уже сказано, ты сначала должен дождаться выполнения колбека, который устанавливает значение переменной. Этот колбек вызывается ПОСЛЕ того как у тебя выполняется последний console.log. Однако, JavaScript ты обычно не можешь просто так взять и подождать чего-то, приостановив выполнения программы (это допустимо только в случае консольных утилит), поэтому тебе нужно плясать от этого колбека, сделать так, чтоб он триггерил выполнение последующего кода.

anonymous
()
Ответ на: комментарий от anonymous

Примерно это я и предполагал. Будет ли anonymous настолько любезен показать как

триггерил выполнение последующего кода

?

braboar
() автор топика
Ответ на: комментарий от metrokto

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

braboar
() автор топика
Ответ на: комментарий от braboar

Был не прав.

С коллбеком все получилось, всем спасибо.

braboar
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.