Когда вызывается executor-функция задаваемая в конструкторе
От: VladCore  
Дата: 19.08.19 05:54
Оценка:
Интересует как встроенный, типа fetch, так и свой инстанс созданный new Promise

На интуитивном уровне, пока к промису никто не обратится с помощью await или .then(), то этот экзекьютор не нужно вызывать.

Но так ли это на самом деле?

Ведь fetch то сразу запускает загрузку. В этом легко убедиться если в хроме написать fetch(...);

Вот такой вот и вопрос: Когда же вызывается executor-функция задаваемая в конструкторе new Promise (сразу или пока кто то не попросит результат)?

Если ли различия в поведении с этим executor-ом в
— NodeJS LTS+
— Хром и прочие современные браузере
— в том ES5-кошмаре, который yarn build генерит для старых браузеров

?

P.S. в .NET у таски есть явный метод Start(). а в JavaScript нихрена не понятно
Отредактировано 19.08.2019 17:21 VladCore . Предыдущая версия . Еще …
Отредактировано 19.08.2019 6:05 VladCore . Предыдущая версия .
Re: Когда вызывается executor-функция задаваемая в конструкт
От: Doom100500 Израиль  
Дата: 19.08.19 06:33
Оценка:
Здравствуйте, VladCore, Вы писали:


VC>P.S. в .NET у таски есть явный метод Start(). а в JavaScript нихрена не понятно


Promise вызывается сразу В смысле, что если не вызываешь .then, или забыл await, то просто не увидишь результат, не имеет возможности отмены, и вообще это низкоуровневая абстракция js.
Если хочешь подписки/отписки/отложенный запуск/полный контроль, или просто вникнуть в асинхронность и реактивность, погугли rxjs. Это библиотека Observables
Спасибо за внимание
Отредактировано 19.08.2019 6:37 Doom100500 . Предыдущая версия .
Re[2]: Когда вызывается executor-функция задаваемая в конструкт
От: VladCore  
Дата: 21.08.19 05:16
Оценка:
Здравствуйте, 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;
}


Даже не знаю то ли оно будет делать что надо?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.