Есть ли название для этого фрагмента Javascript "Promise.resolve (). Then (....)"? - PullRequest
0 голосов
/ 29 октября 2018

Так как я столкнулся с конструкцией:

var variable = Promise.resolve().then(function(){
    //
    // do usefull stuff
    //
    return result;
});

часто и потому, что, кажется, что-то отличается от некоторых похожих, но разных:

var variable = Promise.resolve((function(){
    //
    // do usefull stuff
    //
    return result;
})());

и в основном потому, что, как мне кажется, он использовался так часто, как своего рода цепочка Promise, являясь чем-то вроде короткой руки этой более явной длинной руки код:

var variable = new Promise((resolve) => { 
    resolve(()=>{
        // 
        // do usefull stuff
        //
        return result;
    }); 
});

Я был бы очень рад узнать, как другие люди относятся к этому? Это называется «Цепочка обещаний» или «Интегратор функций в обещание», или даже есть имя?

Я считаю, что иметь / знать имя этой конструкции полезно, чтобы сообщить о ее различии второй версии простой конструкции "Преобразовать аргумент в обещание" Promise.resolve()?

Бонус: Что касается различий в обеих исходных конструкциях, я предполагаю, что главное состоит в том, что вторая версия не будет обрабатывать какие-либо ошибки / исключения в унифицированной моде «преобразование в обещание отклоняет», как это делает первый Promise-Chain-Head.

1 Ответ

0 голосов
/ 29 октября 2018

Прямого имени для Promise.resolve().then не существует, но этот шаблон обычно обозначается Promise.try.

Promise.try, который у нас есть у bluebird , который по-прежнему является предложением JavaScript уровня 1 (то есть оно еще не было принято или реализовано в браузерах).

Вы можете заполнить его с помощью:

if (typeof Promise.try !== 'function') {
    Promise.try = {
        try(func) {
            if (typeof this !== 'function') {
                throw new TypeError('Receiver must be a constructor');
            }
            return new this(function (resolve) {
                resolve(func());
            });
        }
    }.try;
}

А затем используйте его:

Promise.try(() => {
  // same as Promise.resolve().then(...
});

Или вы можете использовать асинхронную функцию:

(async () => { // errors here are converted to rejections

})();

С тех пор как асинхронное / ожидание стало популярным, это, как правило, стало меньшей проблемой, поскольку асинхронные функции автоматически превращают выброшенные ошибки в отклонения.

...