Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.11.2016, 12:28
Аспирант
Отправить личное сообщение для -VenoM- Посмотреть профиль Найти все сообщения от -VenoM-
 
Регистрация: 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, но хотелось бы прояснить этот момент.
Ответить с цитированием
  #2 (permalink)  
Старый 06.11.2016, 12:47
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от -VenoM-
Есть, конечно, вариант выполнять все операции в .then, но хотелось бы прояснить этот момент.
Этот вариант единственно правильный.
Причём сама переменная name тут вообще не нужна, работай с result
Ответить с цитированием
  #3 (permalink)  
Старый 06.11.2016, 13:17
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

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

Вообще много решений на этот случай. rx.js, async/await ф-ции, библиотека co и прочие прелести.
Ответить с цитированием
  #4 (permalink)  
Старый 06.11.2016, 17:03
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

resolve(rows);
name=rows;
->
name=rows;
resolve(rows);
Но пока then не случится - всё равно там нифга не будет. Promise - это не какое-то чудо, это суть те же коллбэки, только хитро завёрнутые.
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 06.11.2016, 17:28
Аспирант
Отправить личное сообщение для fuckingquest Посмотреть профиль Найти все сообщения от fuckingquest
 
Регистрация: 28.10.2016
Сообщений: 70

Сообщение от -VenoM-
переменная "name" уже "undefined"
почему "уже"? Если бы было "еще", то может был бы какой то смысл в вопросе.
А так, тут нет вообще проблемы.
Чисто для порядка можно было бы поменять местами присваивание и resolve, как выше сказали, но вообще, Ваш код должен и в этом виде работать, потому что до тех пор, пока не отработает весь код внутри коллбека, then не будет вызван. Это синхронный кусок в одном потоке.
Проблема в чем то другом у Вас.
Ответить с цитированием
  #6 (permalink)  
Старый 06.11.2016, 17:34
Аспирант
Отправить личное сообщение для fuckingquest Посмотреть профиль Найти все сообщения от fuckingquest
 
Регистрация: 28.10.2016
Сообщений: 70

var name

new Promise(function(resolve, reject){
    setTimeout(function(){
    resolve()
    name = "foo"
    })
})
  .then(function(){
     console.log(name) // foo
})
Ответить с цитированием
  #7 (permalink)  
Старый 06.11.2016, 17:45
Аспирант
Отправить личное сообщение для fuckingquest Посмотреть профиль Найти все сообщения от fuckingquest
 
Регистрация: 28.10.2016
Сообщений: 70

Сообщение от -VenoM-
по поводу области видимости переменных, которые присваиваются в теле Promise
нет никакой "особенной" области видимости в теле Promise
Ответить с цитированием
  #8 (permalink)  
Старый 07.11.2016, 09:47
Аспирант
Отправить личное сообщение для -VenoM- Посмотреть профиль Найти все сообщения от -VenoM-
 
Регистрация: 31.10.2016
Сообщений: 44

Понятно. Спасибо за ответы. Значит, буду работать внутри .then. Просто после С, где всё синхронно, возникают вопросы.
Сразу спрошу, а как на счёт глобальных переменных в node.js?
Есть ли какие-то недостатки, которых нет в том же С?
Читал, что использовать их не рекомендуется, однако почему это так страшно ясного пояснения не нашёл.
Ответить с цитированием
  #9 (permalink)  
Старый 07.11.2016, 14:17
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

-VenoM-, потому что глобальные переменные может (случайно) попортить абсолютно любая функция абсолютно любого подключённого скрипта.
__________________
29375, 35
Ответить с цитированием
  #10 (permalink)  
Старый 08.11.2016, 16:41
Аспирант
Отправить личное сообщение для -VenoM- Посмотреть профиль Найти все сообщения от -VenoM-
 
Регистрация: 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 );

    });
});
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Область видимости переменных (this) Артем163 Общие вопросы Javascript 4 21.03.2014 15:32
Помогите пож с JSON, передача id ссылки. wisma jQuery 22 10.02.2014 15:36
Область видимости переменных positiveman Общие вопросы Javascript 3 14.01.2013 15:08
область видимости переменных в prototype (тупой вопрос)) stnw Общие вопросы Javascript 3 11.02.2011 19:25
область видимости переменных jetli13 Общие вопросы Javascript 3 17.09.2010 11:00