Promise и область видимости переменных
По ходу изучения работы с асинхронными ф-циями, возник вопрос по поводу области видимости переменных, которые присваиваются в теле Promise.
Код:
var name; |
Цитата:
Причём сама переменная name тут вообще не нужна, работай с result |
Цитата:
Вообще много решений на этот случай. rx.js, async/await ф-ции, библиотека co и прочие прелести. |
resolve(rows); name=rows;-> name=rows; resolve(rows);Но пока then не случится - всё равно там нифга не будет. Promise - это не какое-то чудо, это суть те же коллбэки, только хитро завёрнутые. |
Цитата:
А так, тут нет вообще проблемы. Чисто для порядка можно было бы поменять местами присваивание и resolve, как выше сказали, но вообще, Ваш код должен и в этом виде работать, потому что до тех пор, пока не отработает весь код внутри коллбека, then не будет вызван. Это синхронный кусок в одном потоке. Проблема в чем то другом у Вас. |
var name new Promise(function(resolve, reject){ setTimeout(function(){ resolve() name = "foo" }) }) .then(function(){ console.log(name) // foo }) |
Цитата:
|
Понятно. Спасибо за ответы. Значит, буду работать внутри .then. Просто после С, где всё синхронно, возникают вопросы.
Сразу спрошу, а как на счёт глобальных переменных в node.js? Есть ли какие-то недостатки, которых нет в том же С? Читал, что использовать их не рекомендуется, однако почему это так страшно ясного пояснения не нашёл. |
-VenoM-, потому что глобальные переменные может (случайно) попортить абсолютно любая функция абсолютно любого подключённого скрипта.
|
Ещё такой вопрос. Что-то я торможу.
Такая штука. Когда клиент подключается - в консоль сразу выводится подключение. Но событие '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 ); }); }); |
С колбеками более-менее понял, async/await интересная штука, но пока нет потребности в ней, т.к. сильно бы тормозил программу такой подход.
Столкнулся с тем что: function addOne(callback) { connection.query(strQuery, function (err, rows) { myNumber=rows[0].Name; callback.call(myNumber); }); } function addTwo(callback) { connection.query(strQuery, function (err, rows) { myNumber=rows[0].Customer_ID; callback.call(myNumber.toString()); }); // нужно выполнить addOne с результатом temp1, передать его в addTwo и выполнить addTwo addOne(function () { if (this=='Vlad') { temp1=this; console.log(this); } addTwo(function (){ if (this=='2233') { temp2=this; console.log(this); } return temp2; }); return temp1; }); } Я так понимаю, что addTwo должна иметь ещё один аргумент. Однако, если его просто добавить, то callback.call уже не будет работать. |
addOne(function () { if (this=='Vlad') { var temp1 = this; console.log(this); } addTwo(function (){ //temp1 виден отсюда без дополнительных телодвижений, т.к. функция создаётся прямо тут и замыкает на себя вышестоящий контекст if (this=='2233') { var temp2 = this; console.log(this, temp1); } return temp2; }); return temp2; }); |
Часовой пояс GMT +3, время: 02:31. |