Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 20.05.2021, 19:49
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

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 = 'новая строка' 
}
Ответить с цитированием
  #22 (permalink)  
Старый 20.05.2021, 19:53
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от 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 = 'новая строка' 
}
Ответить с цитированием
  #23 (permalink)  
Старый 20.05.2021, 20:17
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от fxobject
с()
рассматривать как B()
Твой "пример" и так работает...

let X
A()
function A(){
	B();
	alert('Из A ' + X)
}
function B(){
	d();
	alert('Из B ' + X)
}
async function d(){
	X = 'новая строка' ;
}
Ответить с цитированием
  #24 (permalink)  
Старый 20.05.2021, 20:28
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от 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 = 'новая строка' ;
}
Ответить с цитированием
  #25 (permalink)  
Старый 20.05.2021, 20:43
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Сообщение от fxobject
только не поднимайте async до самого верха до функции A
А почему собственно?
Ответить с цитированием
  #26 (permalink)  
Старый 20.05.2021, 20:46
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Сообщение от fxobject
выйдет из всех процедур (а тама ждут результата) и только вывалившись в ядро JS (попав в очередь задач) начнет выполнять D
Выполняться то она начнет сразу, как ее вызвали. И сразу, вернет промис. А вот когда он разрешится, это уже другой вопрос.
Ответить с цитированием
  #27 (permalink)  
Старый 20.05.2021, 20:47
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от voraa
А почему собственно?
Он просил про это не спрашивать...

Сообщение от fxobject
без вопросов - "а зачем"?
Ответить с цитированием
  #28 (permalink)  
Старый 20.05.2021, 21:04
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

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

;(async function ()  {
   let res = await asfunc ();
  // обрабатываем результат
})();
Ответить с цитированием
  #29 (permalink)  
Старый 20.05.2021, 21:33
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от 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.
Ответить с цитированием
  #30 (permalink)  
Старый 20.05.2021, 22:59
Аватар для fxobject
Кандидат Javascript-наук
Отправить личное сообщение для fxobject Посмотреть профиль Найти все сообщения от fxobject
 
Регистрация: 01.03.2021
Сообщений: 138

подписку на события использую постоянно. вопрос технический. пытаюсь упорядочить представление о предмете.
Итак предложенный работающий вариант:
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()
}
Вот так уже не работает......
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами в mongodb, api, frontend с паттерном async & await YTigiev Node.JS 0 21.11.2019 20:17
async await + es6???? Роман Андреевич Node.JS 1 20.12.2018 13:25
Выполнение массива промисов последовательно arealhz Node.JS 30 07.07.2018 12:45
Представляем вам ORMjs ORMjs Оффтопик 55 17.01.2017 02:46
распарсить строку json sotik AJAX и COMET 14 24.11.2014 16:06