Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407

Можно ли для одного промиса повторно установить второй then после выполнения первого

02.03.2026, 12:28. Показов 2014. Ответов 59
Метки нет (Все метки)

Не подскажите, есть ли решение:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
rc= fun_0 ();
 rc.then (res => { console.log (`rc-1. AFTER fun_0 │ res= ${res}`); });
// rc.then (res => { console.log (`rc-2. rc.then => fun_0 -  after button │ res= ${res} `) });
 
function fun_0 ()  {
return new Promise(function(resolve, reject) {
    let promise= fun_1 ();      // new_divPr
    promise.then (st => { console.log (`promise.then =>  CLOSE !!! │ st=${st}`); resolve (st); })
    setTimeout(() => console.log (" setTimeout - 1 "), 1000);
    console.log (" *** GET fun_0 *** ");
    setTimeout(() => resolve(0), 1000);
    
}); 
}
 
function fun_1 ()  {
return new Promise(function(resolve, reject) {
 let st= 123456;
 setTimeout(() => resolve(st), 3000);
});
}

2-й rc.then специально закомментировал, чтобы показать, что мне его нужно установить после выполнения rc-1 с целью получить результат (= 123456) после выполнения fun_1. Обращаю внимание, нужно, чтобы fun_1 запускалась именно из fun_0.
Т.е. другими словами после того, как из очереди задач будет удален rc-1, установить rc-2 в очередь. для этого же промиса.
И уже в другой формулировке: rc-1 выполняется после завершения fun_0, а rc-2 после завершения fun_1
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.03.2026, 12:28
Ответы с готовыми решениями:

Срабатывание then(resolve) при отклоненном промисе
Здравствуйте, прошу помочь разобраться. let promise1 = new Promise((resolve, reject) => {...

Каким образом промис может передать результаты своей работы в обработчик Promise.allSettled.then() ?
Добрый день! Ситуация: Есть функция (далее - вызывающая функция), которая вызывает...

Промисы и последовательное выполнение функций
До JS я изучал Basic, Pascal, Python. Когда я впервые встретился с асинхронщиной в JS - это вызвало...

59
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3857 / 1740 / 432
Регистрация: 14.03.2022
Сообщений: 4,434
02.03.2026, 15:13
755, давай попробуем начать с самой сути... Вдруг получится!

У тебя есть два просмиса - fun_0 и fun_1...
Каждый что-то возвращает...

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
// 
function fun_0 ()  {
    return new Promise(function(resolve, reject) {
        setTimeout(() => resolve(0), 1000);
 
    }); 
}
// 
function fun_1 ()  {
    return new Promise(function(resolve, reject) {
        setTimeout(() => resolve(123456), 3000);
    });
}
Что ты от них собрался получить?
Влияет ли результат fun_0 на работу fun_1?
Что должно быть в итоге, когда завершатся оба промиса?
0
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
02.03.2026, 15:15  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Писать код нормально "было бы глупо"?
Знать бы как нормально...

Не по теме
Уже после смерти моего брата обнаружил среди его грамот физтеховскую: за оригинальное решение задач(и) (не помню по физике или математике). И здесь кто-то мог бы написать - ненормальное решение - надо решать правильно.
Возможно и у меня была аналогичная история на олимпиаде по математике: одна задача оказалась сложной, хотя результат получил, а дома мама решила задачу - оказалось, что мой результат бал правильным. До сих пор иногда вспоминаю, что поступил неправильно: надо было приложить результат с пачкой черновиков - возможно, было бы не 3-е место.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3857 / 1740 / 432
Регистрация: 14.03.2022
Сообщений: 4,434
02.03.2026, 15:15
P.S.
Еще бы знать что вообще делают те промисы...
Но я так сильно не давлю.
0
Эксперт .NET
 Аватар для Usaga
14354 / 9457 / 1360
Регистрация: 21.01.2016
Сообщений: 35,653
02.03.2026, 15:17
Цитата Сообщение от 755 Посмотреть сообщение
Знать бы как нормально...
Для этого нужно исходную проблему озвучить, а не своё видение её решения.
0
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
02.03.2026, 15:17  [ТС]
krvsa и voraa, спасибо за примеры. Пока вынужден отвлечься на другие дела. А потом вернусь к теме, чтобы посмотреть на них
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3857 / 1740 / 432
Регистрация: 14.03.2022
Сообщений: 4,434
02.03.2026, 15:18
755, "оригинальное" не равно черти какому.

Оригинальное решение, как правило, вызывает радость и восхищение.
А это не твой случай.
0
Эксперт .NET
 Аватар для Usaga
14354 / 9457 / 1360
Регистрация: 21.01.2016
Сообщений: 35,653
02.03.2026, 15:18
Цитата Сообщение от 755 Посмотреть сообщение
И здесь кто-то мог бы написать - ненормальное решение - надо решать правильно.
Нет. Не путай. В твоём случае - не нормально поставленная задача (как эта) просто признак того, что ты сам не понимаешь, что делаешь и зачем.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3857 / 1740 / 432
Регистрация: 14.03.2022
Сообщений: 4,434
02.03.2026, 15:19
Цитата Сообщение от 755 Посмотреть сообщение
И здесь кто-то мог бы написать - ненормальное решение - надо решать правильно.
Не стоит выдумывать того, чего нет.
0
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
02.03.2026, 15:21  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Для этого нужно исходную проблему озвучить, а не своё видение её решения
Да я вроде бы первоначально привел пример (как не раз упоминал krvsa, для удобства) а также для понимания задачи.
Если же под видением подразумеваются промисы, то не думал, что есть иные пути ее решения - синхронное решение здесь не работает, остается только асинхронное
0
 Аватар для voraa
1296 / 1280 / 190
Регистрация: 21.01.2024
Сообщений: 5,925
02.03.2026, 15:24
Лучший ответ Сообщение было отмечено 755 как решение

Решение

Цитата Сообщение от krvsa Посмотреть сообщение
У тебя есть два просмиса - fun_0 и fun_1...
Каждый что-то возвращает...
Я так понял, что fun_0 внутри себя запускает fun_1, которая возвращает промис, который может разрешиться позже, чем тот, который возвращает fun_0.
И надо написать для них thenы,которые и исполняться будут соответственно. Первый после промиса от fun_0, второй после промиса от fun_1

Я решил это так
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function fun0 () {
    return new Promise ((res) =>{
        const p1 = fun1();
        setTimeout(() => res([0,p1]), 1000);
    });
}
function fun1 () {
    return new Promise ((res) =>{   
        setTimeout(() => res(123456), 3000);
    });
}
 
let rc = fun0();
rc.then (([res, p1]) => {console.log (`rc-1. AFTER fun_0 │ res= ${res}`); return p1}) // then после промиса от fun0
    .then(res => {console.log (`rc-2. rc.then => fun_0 -  after button │ res= ${res} `)}); // then после промиса от fun1
0
Эксперт .NET
 Аватар для Usaga
14354 / 9457 / 1360
Регистрация: 21.01.2016
Сообщений: 35,653
02.03.2026, 15:26
Цитата Сообщение от 755 Посмотреть сообщение
Да я вроде бы первоначально привел пример
Так пример синтетический. Исходная задача какая была?
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3857 / 1740 / 432
Регистрация: 14.03.2022
Сообщений: 4,434
02.03.2026, 15:47
Цитата Сообщение от voraa Посмотреть сообщение
Я так понял, что fun_0 внутри себя запускает fun_1, которая возвращает промис, который может разрешиться позже, чем тот, который возвращает fun_0.
И надо написать для них thenы,которые и исполняться будут соответственно. Первый после промиса от fun_0, второй после промиса от fun_1
Так даже такая интерпретация задачки имеет мало практического смысла...
Зачем из одного промиса запускать другой, никак не связанный с первым, а затем их результаты "ловить" в разных then...
Просто потому что так захотелось?

Добавлено через 3 минуты
P.S.
Я же совсем забыл про поиск оригинального решения!
0
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
02.03.2026, 15:47  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
Я так понял, что fun_0 внутри себя запускает fun_1, которая возвращает промис, который может разрешиться позже, чем тот, который возвращает fun_0.
И надо написать для них thenы,которые и исполняться будут соответственно. Первый после промиса от fun_0, второй после промиса от fun_1
На секундочку заскочил на форум и увидел данное сообщение.
Да, voraa, Вы абсолютно правильно поняли. И получается решение есть. Не успел пока посмотреть предыдущие.
Просто хотел подтвердить, что правильно поняли - именно такая задача стояла и порадовали ответом.

Извините, возможно были ответы с решениями и раньше.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3857 / 1740 / 432
Регистрация: 14.03.2022
Сообщений: 4,434
02.03.2026, 15:49
Цитата Сообщение от 755 Посмотреть сообщение
И получается решение есть.
Ты изначальную проблему опиши для начала. А не то как построить х/з чего...
Как это делается - я описал тебе выше.
0
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
02.03.2026, 15:58  [ТС]
Цитата Сообщение от krvsa Посмотреть сообщение
Зачем из одного промиса запускать другой, никак не связанный с первым, а затем их результаты "ловить" в разных then.
Никак не удается уйти.
krvsa, мой конкретный случай.
Стандартная функция вывода модального окна. (fun_0). После ее завершения, например хочу изменить размеры окна либо еще какие-то нестандартные действия - 1-й then (если они начнут выполняться пока МО не загружено - выскочит ошибка).
Потом клик по одной из кнопок МО - результат работы - срабатывает 2-й then.

Добавлено через 1 минуту
Цитата Сообщение от krvsa Посмотреть сообщение
Ты изначальную проблему опиши для начала.
Старался и Думал, что подробно описал в начале темы
0
 Аватар для voraa
1296 / 1280 / 190
Регистрация: 21.01.2024
Сообщений: 5,925
02.03.2026, 16:07
Цитата Сообщение от 755 Посмотреть сообщение
Стандартная функция вывода модального окна. (fun_0). После ее завершения, например хочу изменить размеры окна либо еще какие-то нестандартные действия - 1-й then (если они начнут выполняться пока МО не загружено - выскочит ошибка).
Потом клик по одной из кнопок МО - результат работы - срабатывает 2-й then.
Ну так в первом then создаем и возвращаем промис на кнопку по закрытию. Второй then ловит его.
А вообще нормально делать обработку кликов по кнопкам по событиям, а не по промисам. Ну так обычно делают потому, что это удобнее.

Промисы - это для асинхронной работы чего то в браузере - получить данные из сети, прочитать файл, сделать запрос к БД. А действия пользователя - это события.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3857 / 1740 / 432
Регистрация: 14.03.2022
Сообщений: 4,434
02.03.2026, 16:43
Цитата Сообщение от 755 Посмотреть сообщение
мой конкретный случай.
Это не случай... Это больная фантазия.
Какую задачу решают твои промисы?

Добавлено через 1 минуту
Цитата Сообщение от 755 Посмотреть сообщение
Старался и Думал, что подробно описал в начале темы
Ты пока такое не можешь осилить...

Кто такой МО?
Министерство Обороны?

Добавлено через 1 минуту
Цитата Сообщение от 755 Посмотреть сообщение
Стандартная функция вывода модального окна. (fun_0). После ее завершения, например хочу изменить размеры окна либо еще какие-то нестандартные действия - 1-й then (если они начнут выполняться пока МО не загружено - выскочит ошибка).
Потом клик по одной из кнопок МО - результат работы - срабатывает 2-й then.
Ничего именно "стандартного" в твоем описании нет.
Это все нарисовало твое воображение.

Добавлено через 9 минут
Цитата Сообщение от 755 Посмотреть сообщение
мой конкретный случай
Вот его решение...

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
console.log('Пуск.')
fun_0()
    .then(r => {
        console.log('Окно загружено.')
        return fun_1()
    })
    .then(r => console.log('Все.'))
 
// 
function fun_0()  {
    return new Promise(function(resolve, reject) {
        console.log('Загружается модальное окно...')
        setTimeout(() => resolve(), 1000);
 
    }); 
}
// 
function fun_1()  {
    return new Promise(function(resolve, reject) {
        console.log('Выполняются нестандартные действия...')
        setTimeout(() => resolve(), 3000);
    });
}
Добавлено через 2 минуты
Цитата Сообщение от voraa Посмотреть сообщение
А вообще нормально делать обработку кликов по кнопкам по событиям, а не по промисам. Ну так обычно делают потому, что это удобнее.
Ты забыл про оригинальное решение...
Никаких стандартов и удобств!
0
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
02.03.2026, 17:45  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
Ну так в первом then создаем и возвращаем промис на кнопку по закрытию. Второй then ловит его.
А вообще нормально делать обработку кликов по кнопкам по событиям, а не по промисам.
voraa, только вернулся и не успел посмотреть на все предложенные ранее варианты. Но заранее уверен, что Ваш вариант рабочий и то, что нужно.
Конечно же в моем конкретном случае установлен обработчик событий на кнопки, для каждой из которых вызывается соответствующая функция.
Цитата Сообщение от voraa Посмотреть сообщение
Ну так обычно делают потому, что это удобнее.
А вот это уже спорный аргумент. Хоть и на основании одной темы подумал, что вы умнее меня, но позволю себе не согласиться с Вами, хотя и не утверждаю, что я прав. Возможно, для большинства так и удобнее. Я же, пока не знал об асинхронности, также поступал как обычно. Теперь же склоняюсь к другому алгоритму. Хотя до конца и не взвесил все плюсы и минусы.

Цитата Сообщение от voraa Посмотреть сообщение
Промисы - это для асинхронной работы чего то в браузере - получить данные из сети, прочитать файл, сделать запрос к БД. А действия пользователя - это события.
Конечно, это понимаю. Но в данной ситуации логичнее при выводе модального окна действия пользователя за счет асинхронности превратить в ожидание - выведено МО, ждем ответ от Пользователя, который через resolve передается в вызывающую функцию. Кроме того:
- если раньше приходилось создавать глобальные переменные для разных областей видимости, то при таком подходе это как правило не потребуется;
- можно создавать вложенные функции, чего было нельзя при старом подходе и приходилось думать, чтобы имена не совпали.

Но все это в теории, на практике же надо видеть код, чтобы понять и оценить правильность суждения

Добавлено через 2 минуты
Цитата Сообщение от krvsa Посмотреть сообщение
Кто такой МО?
Министерство Обороны?
У нас речь о программировании, а не о событиях на Украине. Кроме того в предыдущем абзаце была расшифровка данного термина - думал, что в основном программисты народ сообразительный, чтобы понять, что такое МО. Да, думаю, и Вы это поняли.

Добавлено через 4 минуты
Цитата Сообщение от krvsa Посмотреть сообщение
Ничего именно "стандартного" в твоем описании нет.
krvsa, считал, приводить весь код вывода МО из-за его объема - захламлением темы. Поэтому и привел условное сравнение вывода МО - fun_0 - некая стандартная функция (точнее, комплекс).
0
 Аватар для voraa
1296 / 1280 / 190
Регистрация: 21.01.2024
Сообщений: 5,925
02.03.2026, 18:08
Цитата Сообщение от 755 Посмотреть сообщение
krvsa, считал, приводить весь код вывода МО из-за его объема - захламлением темы.
А какой та объем то? .showModal() и все
Цитата Сообщение от 755 Посмотреть сообщение
(если они начнут выполняться пока МО не загружено - выскочит ошибка).
Такого не будет, если делать все как положено, через <dialog>. Он для этого и предназначен.
0
-62 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 407
02.03.2026, 18:27  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
А какой та объем то? .showModal() и все
Затрудняюсь сказать - порядка 1000 строк js (но это с учетом пустых строк и комментариев)
Цитата Сообщение от voraa Посмотреть сообщение
Такого не будет, если делать все как положено, через <dialog>
Все-таки иду своим путем, не через <dialog>. Возможно, он и лучше, но одна из причин: раз начал, то надо идти до конца, а не метаться туда-сюда. Тем более, что меня все в основном устраивает в плане интерфейса и скорости работы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.03.2026, 18:27

Промисы и последовательное выполнение функций
Добрый день Мне нужно последовательно выполнить асинхронную функцию(и) несколько раз. Пытаюсь...

Промисы и последовательное выполнение функций
Имеется две асинхронные функции async1() и async2(), которые должны выполнится по очереди. Первая...

Как дождаться выполнения всех промисов? async/await
Добрый вечер! В функции, которая не является async (делать ее таково йне предполагается) делаются...

Как приостановить выполнение скрипта, пока не загрузится промис?
Всем привет! :drink: Подскажите, как приостановить выполнение скрипта, пока не загрузится...

Как возвращать результат первого выполнившего­­ся промиса?
Задание: Напишите функцию, которая принимает массив промисов и возвращает результат того, который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru