Подтвердить что ты не робот

Promise.resolve vs new Promise (разрешить)

Я использую bluebird, и я вижу два способа решения синхронных функций в Promise, но я не понимаю различия между обоими способами. Похоже, что stacktrace немного отличается, поэтому они не просто alias, правильно?

Итак, каков предпочтительный способ?

Способ A

function someFunction(someObject) {
  return new Promise(function(resolve) {
    someObject.resolved = true;
    resolve(someObject);
  });
}

Путь B

function someFunction(someObject) {
  someObject.resolved = true;
  return Promise.resolve(someObject);
}
4b9b3361

Ответ 1

В отличие от обоих ответов в комментариях - есть разница.

Пока Promise.resolve(x); в основном то же самое, что new Promise(function(r){ r(x); }); есть тонкость.

Функции возврата обещаний обычно должны иметь гарантию, что они не должны бросать синхронно, так как они могут асинхронно бросать. Чтобы предотвратить неожиданные результаты и условия гонки - броски обычно преобразуются в возвращенные отклонения.

С учетом этого - когда спецификация была создана, конструктор обещаний безопасен для броска.

Что делать, если someObject - undefined?

  • Путь A возвращает отклоненное обещание.
  • Путь B бросается синхронно.

Синяя птица увидела это, и Петка добавил Promise.method, чтобы решить эту проблему, чтобы вы могли продолжать использовать возвращаемые значения. Таким образом, правильный и самый простой способ написать это в Bluebird на самом деле не так - это:

var someFunction = Promise.method(function someFunction(someObject){
    someObject.resolved = true;
    return someObject;
});

Promise.method преобразует броски в отклонения и возвращается к разрешению для вас. Это самый безопасный способ бросить вызов, и он ассимилирует then ables через возвращаемые значения, чтобы он работал, даже если someObject на самом деле является обещанием.

В общем случае Promise.resolve используется для приведения объектов и внешних promises (thenables) в promises. Это его прецедент.