Интересует как встроенный, типа fetch, так и свой инстанс созданный new Promise
На интуитивном уровне, пока к промису никто не обратится с помощью await или .then(), то этот экзекьютор не нужно вызывать.
Но так ли это на самом деле?
Ведь fetch то сразу запускает загрузку. В этом легко убедиться если в хроме написать fetch(...);
Вот такой вот и вопрос: Когда же вызывается executor-функция задаваемая в конструкторе new Promise (сразу или пока кто то не попросит результат)?
Если ли различия в поведении с этим executor-ом в
— NodeJS LTS+
— Хром и прочие современные браузере
— в том ES5-кошмаре, который yarn build генерит для старых браузеров
?
P.S. в .NET у таски есть явный метод Start(). а в JavaScript нихрена не понятно
Здравствуйте, VladCore, Вы писали:
VC>P.S. в .NET у таски есть явный метод Start(). а в JavaScript нихрена не понятно
Promise вызывается сразу В смысле, что если не вызываешь .then, или забыл await, то просто не увидишь результат, не имеет возможности отмены, и вообще это низкоуровневая абстракция js.
Если хочешь подписки/отписки/отложенный запуск/полный контроль, или просто вникнуть в асинхронность и реактивность, погугли rxjs. Это библиотека Observables
Здравствуйте, Doom100500, Вы писали:
VC>>P.S. в .NET у таски есть явный метод Start(). а в JavaScript нихрена не понятно
D>Promise вызывается сразу В смысле, что если не вызываешь .then, или забыл await, то просто не увидишь результат, не имеет возможности отмены, и вообще это низкоуровневая абстракция js.
D>Если хочешь подписки/отписки/отложенный запуск/полный контроль, или просто вникнуть в асинхронность и реактивность, погугли rxjs. Это библиотека Observables
Да вот пока не пойму как такое делают: В ивенте логически завершается flow и интуитивно хочется там записать resolve(errors);
// Надо вернуть промис массива ошибок:
async function runTest () {
const errors = [];
let resolveCopy = null, rejectCopy = null;
const ret = new Promise( (resolve, reject) => {
// свято верим что это выполнится сразу!
resolveCopy = resolve; rejectCopy = reject;
});
const protocol = .....;
protocol.Page.loadEventFired(async() => {
try
{
// тут всякая логика.
}
finally {
resolveCopy(errors);
}
});
protocol.Page.navigate({url: url});
return ret;
}
Фигня полная?
Неет! еще не полная.
Дополнительно нужна добавить обработку таймаута — если ивент
loadEventFired не вызвался за N миллискунд, то надо добавить в массив еrrors еще одну ошибку и сделать resolveCopy(errors)
Так делать принято или нет:
const delay = ms => new Promise(res => setTimeout(res, ms));
// Надо вернуть промис массива ошибок:
async function runTest () {
const errors = [];
let resolveCopy = null, rejectCopy = null;
const ret = new Promise( (resolve, reject) => {
// свято верим что это выполнится сразу!
resolveCopy = resolve; rejectCopy = reject;
});
const protocol = .....;
protocol.Page.loadEventFired(async() => {
try
{
// тут всякая логика.
}
finally {
resolveCopy(errors);
}
});
protocol.Page.navigate({url: url});
new Promise(async () => {
await delay(5000);
if (!resolved)
{
errors.push("Timeout expired. Page cannot be not loaded");
resolveCopy(errors);
}
});
return ret;
}
Даже не знаю то ли оно будет делать что надо?