Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   promise (async await) (https://javascript.ru/forum/node-js-io-js/82531-promise-async-await.html)

ksa 20.05.2021 19:49

fxobject, вот, взял с твоего "текста" понятный кусок...
Цитата:

Сообщение от fxobject
function B(){
d(); //--- инициализирует global.X
let z = global.X; //-- вот тут должно быть значение 'новая строка'
}
async d(){
global.X = 'новая строка' ;
}

На его примере показываю нормальный тестовый пример. ;)

let X

B()

function B() {
	myFnc()
	alert(X)
}
async function myFnc() {
	return await d()
}
async function d() {
	X = 'новая строка' 
}

ksa 20.05.2021 19:53

Цитата:

Сообщение от fxobject
с()
рассматривать как B()

Как вариант...

let X
A()

function A(){
	B();
	alert('Это из A ' + X)
}
function B() {
	myFnc()
	alert('Это из B ' + X)
}
async function myFnc() {
	return await d()
}
async function d() {
	X = 'новая строка' 
}

ksa 20.05.2021 20:17

Цитата:

Сообщение от fxobject
с()
рассматривать как B()

Твой "пример" и так работает...

let X
A()
function A(){
	B();
	alert('Из A ' + X)
}
function B(){
	d();
	alert('Из B ' + X)
}
async function d(){
	X = 'новая строка' ;
}

ksa 20.05.2021 20:28

Цитата:

Сообщение от fxobject
расставляйте что надо сделать (только не поднимайте async до самого верха до функции A)

Т.е. так тоже можно?

let X
A()

function A(){
	B().then(res => alert('Из A ' + X))
}
async function B(){
	d().then(res => alert('Из B ' + X));
}
async function d(){
	X = 'новая строка' ;
}

voraa 20.05.2021 20:43

Цитата:

Сообщение от fxobject
только не поднимайте async до самого верха до функции A

А почему собственно?

voraa 20.05.2021 20:46

Цитата:

Сообщение от fxobject
выйдет из всех процедур (а тама ждут результата) и только вывалившись в ядро JS (попав в очередь задач) начнет выполнять D

Выполняться то она начнет сразу, как ее вызвали. И сразу, вернет промис. А вот когда он разрешится, это уже другой вопрос.

ksa 20.05.2021 20:47

Цитата:

Сообщение от voraa
А почему собственно?

Он просил про это не спрашивать... :nono:

Цитата:

Сообщение от fxobject
без вопросов - "а зачем"?


voraa 20.05.2021 21:04

Ну я понимаю, что бывают ситуации, когда очень нужно вызвать асинхронную функцию, дождаться результата и обработать его с верхнего уровня, где нельзя использовать await (вроде в последних Chrome и Node уже можно). Но ведь тогда так можно

;(async function ()  {
   let res = await asfunc ();
  // обрабатываем результат
})();

ksa 20.05.2021 21:33

Цитата:

Сообщение от voraa
Но ведь тогда так можно

Раздел ведь про Node.JS - тогда там почти все наследовано от eventEmitter, значит можно использовать события.

const o = asfunc().then(res => o.emit('data', res))
o.on('data', (err, res) => alert(res))

fxobject 20.05.2021 22:59

подписку на события использую постоянно. вопрос технический. пытаюсь упорядочить представление о предмете.
Итак предложенный работающий вариант:
let X
A()
function A(){
B();
alert('Это из A ' + X)
}
function B() {
myFnc()
alert('Это из B ' + X)
}
async function myFnc() {
return await d()
}
async function d() {
X = 'новая строка'}
Действительно выдает правильный результат. Что внесло еще больше смятений..... потому как не должен.
Внесем в него небольшие поправки....
давайте задержим выполнение функции MyFunc
например так:
async function myFnc() {
let promise = new Promise((resolve,reject)=>{
setTimeout(()=>resolve("ok"),4000)});
let result = await promise;
alert(result);
return await d()
}
Вот так уже не работает......


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