В чем разница между Promise.resolve (затем) и новым Обещанием (затем). - PullRequest
4 голосов
/ 02 июня 2019

Вопрос в названии. Я пытаюсь получить более глубокое понимание обещаний, и я думаю, что я выяснил, как работает Promise.resolve(thenable), или, по крайней мере, в основном, как это работает, рассматривая примеры на MDN. Мне интересно, есть ли разница между ними. Я набросал этот пример, чтобы показать, что они ведут себя одинаково, и я думаю, что они будут демонстрировать различия в поведении, если они будут. Но очевидно, что одного этого теста недостаточно, чтобы заключить, что в них нет ничего особенного, поэтому я пришел сюда.

let thenable = {
    then(resolve) {
        setTimeout(()=>{
            resolve((()=>{
                console.log('test');
                return thenable;
            })());
        }, 1000);
    },
};

let p1 = Promise.resolve(thenable);
let p2 = new Promise(thenable.then);

Ответы [ 3 ]

4 голосов
/ 02 июня 2019

В вашем примере эти два работают в основном одинаково. Вы правы, передавая resolve и reject к вызову метода then для thenable, это то, что в основном происходит, когда вы разрешаете обещание с помощью объекта thenable.

Однако есть несколько отличий:

  • метод then объекта thenable вызывается как метод (с контекстом this) объекта thenable, в отличие от вашего new Promise(thenable.then) - .bind(thenable) исправит это.
  • Promise.resolve (очевидно) должен сначала проверить, является ли переданный объект доступным для всех, он также обрабатывает непонятные случаи, когда доступ (не вызов) .then throws
  • тонкое несоответствие во времени: Promise.resolve планирует даже вызов then асинхронно:

    Promise.resolve({
      get then() {
        console.log("property access");
        return function(res, rej) {
          console.log("method call");
          res("fulfillment");
        };
      }
    }).then(console.log);
    console.log("sync execution end");
    
2 голосов
/ 02 июня 2019

Не должно быть никакой разницы между этими двумя конструкциями (Promise.resolve(thenable) и new Promise(thenable.then))

  • Оба поддерживают resolve, reject в качестве параметров.
  • Если ошибкаброшенный в then(resolve) { ... }, он будет неявно пойман, и обещание будет отклонено.
  • Разрешение then(resolve) { ... } с помощью thenable приведет к бесконечной рекурсии.
0 голосов
/ 02 июня 2019

Вы должны понимать различия.

Объектом, доступным для чтения, является просто любой объект, имеющий метод then.Обещания и возвраты объектов асинхронных функций возможны, но также и ваши собственные.

Объекты асинхронных функций НЕ ПРЕДЛАГАЮТ!Они возвращают Обещание.

Обещания - самый сложный тип предметов для жизни.Они предоставляют дополнительные методы, такие как catch и finally, а также имеют статические методы, такие как Promise.all и Promise.resolve.

Ваш p1 выполняет, поскольку имя метода говорит (обычно) разрешенный Promise со значением thenable.<- обычно разрешается при инициализации, но ожидает, потому что вы предоставляете значение asable в качестве значения </p>

Ваш p2 создает неразрешенный Promise с thenable.then в качестве обратного вызова при разрешении.<- неразрешено при инициализации </p>

Надеюсь, это вам поможет.

...