На заданный здесь ранее вопрос с таким же названием, как и на этот, был дан ответ: «Вы не должны использовать это, используйте это вместо этого». Я хочу знать, что он делает, а не что еще я могу сделать, это о понимании. не просто копировать пасту.

Мой вопрос довольно прост, в чем разница между этими тремя подходами при создании обещания?

const API = (item, fail) =>
  new Promise((resolve, reject) => {
    if (fail) reject(item + ' ...with an error');
    setTimeout(() => resolve(item), 1000);
  });

(async () => {
  const pro1 = Promise.resolve(API('I am inside resolve'));
  const pro2 = Promise.resolve(API('I am inside resolve', true));

  const pro3 = Promise.resolve().then(() => API('I am thenable'));
  const pro4 = Promise.resolve().then(() => API('I am thenable', true));

  const pro5 = new Promise((resolve) => resolve(API('I am a new promise')));
  const pro6 = new Promise((resolve) => resolve(API('I am a new promise', true)));

  const store = [pro1, pro2, pro3, pro4, pro5, pro6];

  const results = await Promise.allSettled(store);

  for (const { status, value, reason } of results) {
    if (status === 'fulfilled') console.log(value)
    else console.log(reason)
  }
})();
2
Álvaro 11 Окт 2021 в 19:38

2 ответа

Лучший ответ

Разница в том, что нужно сделать. Хотя все эти методы действительны, они имеют разную стоимость и предсказуемость.

  1. Promise.resolve() создает единственный разрешенный экземпляр Promise, и в зависимости от значения, предоставленного механизму вызова JS, есть информация для его оптимизации. Он заставляет всю работу выполнять за один вызов базового кода движка JS (обычно C ++, но может быть Java или WASM). Так что это всегда лучший выбор.
  2. Promise.resolve().then(() => API(/*...*/)) Создает несколько экземпляров Promise: один по вызову Promise.resolve(), а другой по вызову .then(). Он также выделяет больше памяти и выполняет несколько (3 или более) избыточных переходов между JS и движком. Его сложно оптимизировать, и требуется выполнение интенсивной эвристики, чтобы выяснить, можно ли оптимизировать этот вызов. Это худший вариант.
  3. new Promise((resolve) => resolve(API(/* ... */)) выделяет одну функцию и один экземпляр Promise и выполняет два перехода между JS и движком. Этот вызов сложнее оптимизировать из-за природы JS.
1
Paul Rumkin 11 Окт 2021 в 17:04
Promise.resolve().then() 

В ваших примерах then() не имеет значения, поскольку вы просто выполняете обещание и получаете его данные.

then() обычно используется для цепочки обещаний, возьмите это в качестве примера:

Promise.resolve('foo')
  // 1. Receive "foo", concatenate "bar" to it, and resolve that to the next then
  .then(function(string) {
    return new Promise(function(resolve, reject) {
      setTimeout(function() {
        string += 'bar';
        resolve(string);
      }, 1);
    });
  })
  // 2. receive "foobar", register a callback function to work on that string
  // and print it to the console, but not before returning the unworked on
  // string to the next then
  .then(function(string) {
    setTimeout(function() {
      string += 'baz';
      console.log(string); // foobarbaz
    }, 1)
    return string;
  })

Здесь мы связываем несколько обещаний then() с ранее разрешенным обещанием, сохраняя при этом исходные данные из первого разрешения, хотя в этом случае мы модифицируем их с каждым новым обещанием.

Подробнее об обещаниях и цепочках можно узнать здесь < / а>.

0
Rawley Fowler 11 Окт 2021 в 16:59