Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Promise и область видимости переменных (https://javascript.ru/forum/node-js-io-js/65755-promise-i-oblast-vidimosti-peremennykh.html)

-VenoM- 06.11.2016 12:28

Promise и область видимости переменных
 
По ходу изучения работы с асинхронными ф-циями, возник вопрос по поводу области видимости переменных, которые присваиваются в теле Promise.

Код:

var name;
var semaphore1 = new Promise(function(resolve,reject){
    connection.query(strQuery,function(err,rows) {
        resolve(rows);
        name=rows;
    });
});
semaphore1.then(
    function (result)
    {
        console.log("Fulfilled: " + result[0].Name + " " + name[0].Number)
    },
    error => console.log("Rejected: " + error.message)

);

Т.е. получается, что после того как получаем данные по асинхронному запросу переменная "name" уже "undefined". А мне необходимо с ней работать. Есть, конечно, вариант выполнять все операции в .then, но хотелось бы прояснить этот момент.

Alexandroppolus 06.11.2016 12:47

Цитата:

Сообщение от -VenoM-
Есть, конечно, вариант выполнять все операции в .then, но хотелось бы прояснить этот момент.

Этот вариант единственно правильный.
Причём сама переменная name тут вообще не нужна, работай с result

destus 06.11.2016 13:17

Цитата:

Есть, конечно, вариант выполнять все операции в .then, но хотелось бы прояснить этот момент.
Ну, как вариант, можешь повесить геттер и сеттер на эту переменную и уже в set(newVal:any) будешь знать, что ответ от сервера пришел.

Вообще много решений на этот случай. rx.js, async/await ф-ции, библиотека co и прочие прелести.

Aetae 06.11.2016 17:03

resolve(rows);
name=rows;
->
name=rows;
resolve(rows);
Но пока then не случится - всё равно там нифга не будет. Promise - это не какое-то чудо, это суть те же коллбэки, только хитро завёрнутые.

fuckingquest 06.11.2016 17:28

Цитата:

Сообщение от -VenoM-
переменная "name" уже "undefined"

почему "уже"? Если бы было "еще", то может был бы какой то смысл в вопросе.
А так, тут нет вообще проблемы.
Чисто для порядка можно было бы поменять местами присваивание и resolve, как выше сказали, но вообще, Ваш код должен и в этом виде работать, потому что до тех пор, пока не отработает весь код внутри коллбека, then не будет вызван. Это синхронный кусок в одном потоке.
Проблема в чем то другом у Вас.

fuckingquest 06.11.2016 17:34

var name

new Promise(function(resolve, reject){
    setTimeout(function(){
    resolve()
    name = "foo"
    })
})
  .then(function(){
     console.log(name) // foo
})

fuckingquest 06.11.2016 17:45

Цитата:

Сообщение от -VenoM-
по поводу области видимости переменных, которые присваиваются в теле Promise

нет никакой "особенной" области видимости в теле Promise

-VenoM- 07.11.2016 09:47

Понятно. Спасибо за ответы. Значит, буду работать внутри .then. Просто после С, где всё синхронно, возникают вопросы.
Сразу спрошу, а как на счёт глобальных переменных в node.js?
Есть ли какие-то недостатки, которых нет в том же С?
Читал, что использовать их не рекомендуется, однако почему это так страшно ясного пояснения не нашёл.

Aetae 07.11.2016 14:17

-VenoM-, потому что глобальные переменные может (случайно) попортить абсолютно любая функция абсолютно любого подключённого скрипта.

-VenoM- 08.11.2016 16:41

Ещё такой вопрос. Что-то я торможу.

Такая штука. Когда клиент подключается - в консоль сразу выводится подключение. Но событие 'connection не срабатывает'. Срабатывает только при переподключении клиента, или после получения данных.

const server=net.createServer(function(sock,req){

console.log('console: ' + sock.remoteAddress +' '+ sock.remotePort);

    server.on('connection', function(sock)
    {
        server.getConnections(function(err, count){
            console.log("count", count);
        });
        console.log('OPEN ' + sock.remoteAddress );

    });
});


Часовой пояс GMT +3, время: 20:47.