06.11.2016, 12:28
|
Аспирант
|
|
Регистрация: 31.10.2016
Сообщений: 44
|
|
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, но хотелось бы прояснить этот момент.
|
|
06.11.2016, 12:47
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от -VenoM-
|
Есть, конечно, вариант выполнять все операции в .then, но хотелось бы прояснить этот момент.
|
Этот вариант единственно правильный.
Причём сама переменная name тут вообще не нужна, работай с result
|
|
06.11.2016, 13:17
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
Цитата:
|
Есть, конечно, вариант выполнять все операции в .then, но хотелось бы прояснить этот момент.
|
Ну, как вариант, можешь повесить геттер и сеттер на эту переменную и уже в set(newVal:any) будешь знать, что ответ от сервера пришел.
Вообще много решений на этот случай. rx.js, async/await ф-ции, библиотека co и прочие прелести.
|
|
06.11.2016, 17:03
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,588
|
|
resolve(rows);
name=rows;
->
name=rows;
resolve(rows);
Но пока then не случится - всё равно там нифга не будет. Promise - это не какое-то чудо, это суть те же коллбэки, только хитро завёрнутые.
__________________
29375, 35
|
|
06.11.2016, 17:28
|
Аспирант
|
|
Регистрация: 28.10.2016
Сообщений: 70
|
|
Сообщение от -VenoM-
|
переменная "name" уже "undefined"
|
почему "уже"? Если бы было "еще", то может был бы какой то смысл в вопросе.
А так, тут нет вообще проблемы.
Чисто для порядка можно было бы поменять местами присваивание и resolve, как выше сказали, но вообще, Ваш код должен и в этом виде работать, потому что до тех пор, пока не отработает весь код внутри коллбека, then не будет вызван. Это синхронный кусок в одном потоке.
Проблема в чем то другом у Вас.
|
|
06.11.2016, 17:34
|
Аспирант
|
|
Регистрация: 28.10.2016
Сообщений: 70
|
|
var name
new Promise(function(resolve, reject){
setTimeout(function(){
resolve()
name = "foo"
})
})
.then(function(){
console.log(name) // foo
})
|
|
06.11.2016, 17:45
|
Аспирант
|
|
Регистрация: 28.10.2016
Сообщений: 70
|
|
Сообщение от -VenoM-
|
по поводу области видимости переменных, которые присваиваются в теле Promise
|
нет никакой "особенной" области видимости в теле Promise
|
|
07.11.2016, 09:47
|
Аспирант
|
|
Регистрация: 31.10.2016
Сообщений: 44
|
|
Понятно. Спасибо за ответы. Значит, буду работать внутри .then. Просто после С, где всё синхронно, возникают вопросы.
Сразу спрошу, а как на счёт глобальных переменных в node.js?
Есть ли какие-то недостатки, которых нет в том же С?
Читал, что использовать их не рекомендуется, однако почему это так страшно ясного пояснения не нашёл.
|
|
07.11.2016, 14:17
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,588
|
|
-VenoM-, потому что глобальные переменные может (случайно) попортить абсолютно любая функция абсолютно любого подключённого скрипта.
__________________
29375, 35
|
|
08.11.2016, 16:41
|
Аспирант
|
|
Регистрация: 31.10.2016
Сообщений: 44
|
|
Ещё такой вопрос. Что-то я торможу.
Такая штука. Когда клиент подключается - в консоль сразу выводится подключение. Но событие '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 );
});
});
|
|
|
|