|
|

20.05.2021, 19:49
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,304
|
|
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 = 'новая строка'
}
|
|

20.05.2021, 19:53
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,304
|
|
|
Сообщение от 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 = 'новая строка'
}
|
|

20.05.2021, 20:17
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,304
|
|
|
Сообщение от fxobject
|
с()
рассматривать как B()
|
Твой "пример" и так работает...
let X
A()
function A(){
B();
alert('Из A ' + X)
}
function B(){
d();
alert('Из B ' + X)
}
async function d(){
X = 'новая строка' ;
}
|
|

20.05.2021, 20:28
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,304
|
|
|
Сообщение от 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 = 'новая строка' ;
}
|
|

20.05.2021, 20:43
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,782
|
|
|
Сообщение от fxobject
|
|
только не поднимайте async до самого верха до функции A
|
А почему собственно?
|
|

20.05.2021, 20:46
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,782
|
|
|
Сообщение от fxobject
|
|
выйдет из всех процедур (а тама ждут результата) и только вывалившись в ядро JS (попав в очередь задач) начнет выполнять D
|
Выполняться то она начнет сразу, как ее вызвали. И сразу, вернет промис. А вот когда он разрешится, это уже другой вопрос.
|
|

20.05.2021, 20:47
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,304
|
|
|
Сообщение от voraa
|
|
А почему собственно?
|
Он просил про это не спрашивать...
|
Сообщение от fxobject
|
|
без вопросов - "а зачем"?
|
|
|

20.05.2021, 21:04
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,782
|
|
Ну я понимаю, что бывают ситуации, когда очень нужно вызвать асинхронную функцию, дождаться результата и обработать его с верхнего уровня, где нельзя использовать await (вроде в последних Chrome и Node уже можно). Но ведь тогда так можно
;(async function () {
let res = await asfunc ();
// обрабатываем результат
})();
|
|

20.05.2021, 21:33
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,304
|
|
|
Сообщение от voraa
|
|
Но ведь тогда так можно
|
Раздел ведь про Node.JS - тогда там почти все наследовано от eventEmitter, значит можно использовать события.
const o = asfunc().then(res => o.emit('data', res))
o.on('data', (err, res) => alert(res))
Последний раз редактировалось ksa, 20.05.2021 в 21:37.
|
|

20.05.2021, 22:59
|
 |
Профессор
|
|
Регистрация: 01.03.2021
Сообщений: 156
|
|
|
подписку на события использую постоянно. вопрос технический. пытаюсь упорядочить представление о предмете.
Итак предложенный работающий вариант:
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()
}
Вот так уже не работает......
|
|
|
|