Null же тоже объект, возможно требуется время на его создание, отсюда и проигрыш. На правах предположения. А this уже создан, вы просто передаете на него ссылку.
Aves: изначально я столкнулся с такой ситуацией в nightmare , там следующая связка nightmare - chid_process - runner.js /скорее всего внутри библиотеки electron запускаяется через очередной чилд процесс. В результате я выполняю await nightmare.methodName он через процесс эмитит в runner все это добро, runner эмитит это в физический браузер электрон, где происходит выполнение кода ,дальше все это подымается назад через подписки on. когда экшен получает ответ, он возвращает результаты. Так вот есть там 1 метод, который принудительно все выключает, он тоже экшен, просто он шлет браузеру команду выключиться. В большинстве случаев это так и происходит, однако, есть исключения, когда браузер остается висеть и отрывается от основного процесса. Логика мне подсказывает, что эммитор в этой ситуации просто не может ничег ополучить, потому что в браузере отрабатывает синхронный js , который повесил его.... Отсюда и делема куда копать и есть ли вообще смысл копать. Кстати ваш ответ удалили?
скорее всего потому - что while захватил процесс и внутри while await это синхронный вызов, который никуда не выпустит внутри асинк функции, хотя тут надо точно понимать реализацию на уровне кода.... чего я не знаю
Дмитрий Беляев: спасибо на счет выхода через throw, проверил, да действительно можно это делать, единственное, когда я тестил этот вариант, я делал
(async function test(){
setTimeout(()=>{
throw new Error('TEST ERROR');
}, 1000);
})().then(resp=>{console.log('then: ', resp)}).catch(resp=>{console.error('catch: ', resp)});
что приводило не к тому результату, который я ожидал, по этому позаимсововал на https://developer.mozilla.org/en-US/docs/Web/JavaS... идею с reject, но да в catch достаточно поднимать ошибку выше через throw
За ссылку на код спасибо. полюбопытствую, скажу правда, что сейчвас мне удобнее использование нативных инструментов.
ZaxapKramer: в промисе нет return в нем вызываются 2 функции, одна отправляет результат в then (resolve) вторая в catch (reject) ,смотри мой пример в ответе
Oleg Ulyanov: тогда надо событийную модель строить,
число промисов же в любом случае лимитировано, а значит реакция на каждый промис может быть оценена, а дальше берете редукс и через состояния управляете цепочками промисов. В вашем случае делаете объект состояний, в подписки запихиваете промисы которые должны реагировать на вашу работу, и диспетчите в then всех промисов состояние и требование что с ним делать дальше. Условно говоря у вас есть стартовый промис, который в тхен изменяет состояние, тот промис, что попал под задачу получает из подписки информацию и продолжает цепочку. Если лень мараться с редуксом, можно тоже самое построить через EventEmmiter
Евгений Вольф: в контексе вопроса вашу рекомендацию можно интерпретировать как можно ли хранить переменную в массиве, одну, можно но зачем, когда есть переменная. Вот и здесь так же. Примеры не привожу, так как я с планшета, и пардон не сруки это.
Евгений Вольф: статья объясняет что такое сетинтервал и таймаут, там приведены примеры в чем отличие. То что я дальше комментирую не из статьи, попробуйте задать вопрос что именно вам не понятно и возможно будет нормальный ответ. А так, у меня складывается ощущение, что вы понтите или вам просто безумно скучно.
Евгений Вольф: ваша функция вообще беспонтовая, вызов сетинтервал выдернет задачу из основного процесса и она пойдет выполняться асинхронно, вставка в код вашей функции ровным счетом ничего не даст... читайте статью по ссылке. Мне кажется вы слабо знаете предмет, который обсуждаете.