Promise.resolve - неожиданный результат - PullRequest
0 голосов
/ 19 октября 2018

Я не понимаю, Обещания.Я знаю, что Обещания - это Объекты, которые могут закончиться успешно или ошибочно.И обещания хороши для выполнения асинхронных функций и объединения других асинхронных функций через then.Результат обещания передается в качестве параметра в функцию обратного вызова внутри метода then последнего выполненного обещания (если обещание заканчивается правильно).

Этот пример не работает.Я имитирую асинхронный вызов через setTimeout.Моя функция возвращает целое число.Я ожидаю получить 5 в результате prom2.Почему не работает?Что я делаю не так и почему?

var getProductId = function(){
    setTimeout(function () {
        return 5;
    }, 1500);
};
var prom2 = Promise.resolve(getProductId);

prom2.then(function(result){
    console.log("5 = " + result);
});

Я пробовал также:

var getProductId = function(){
    setTimeout(function () {
        return 5;
    }, 1500);
};
var prom2 = Promise.resolve(getProductId());

prom2.then(function(result){
    console.log("5 = " + result);
});

Примечание: я хочу использовать Promise.resolve, а не new Promise.

Ответы [ 2 ]

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

Promise.resolve ()

Метод Promise.resolve(value) возвращает объект Promise , который разрешается с помощью заданногозначение.Если значение является обещанием, это обещание возвращается;если значение является доступным (то есть имеет метод "then" ), возвращенное обещание будет "следовать" за этим доступным, принимая его возможное состояние;в противном случае возвращенное обещание будет выполнено со значением.Эта функция объединяет вложенные слои объектов, подобных обещанию (например, обещание, которое превращается в обещание, которое разрешается во что-то), в один слой.

Итак, в основном функция Promise.resolve имеет видвозвращая результат getProductId, который равен undefined.Если вы хотите получить результат 5, вам нужно использовать конструктор new Promise.

В этом фрагменте кода показан результат (55) getProductId для демонстрации использования Promise.resolve.

var getProductId = function() {
  setTimeout(function() {
    return 5;
  }, 1500);
  
  return 55
};
var prom2 = Promise.resolve(getProductId());

prom2.then(function(result) {
  console.log("55 = " + result);
});
0 голосов
/ 19 октября 2018

Все, что делает Promise.resolve, это принимает выражение и превращает его в Promise, который немедленно разрешает это выражение.Если выражение представляет собой простой тип любого значения (примитив, массив, объект и т. Д.) , отличающийся от , отличного от Promise, то Promise, возвращаемое Promise.resolve, все равно разрешится немедленно.Ваша функция getProductId ничего не возвращает, поэтому ваш prom2 приводит к Promise, который немедленно принимает значение undefined.

Promise.resolve не поможет вашей ситуации - вам нужнопреобразовать обратный вызов в Promise, и единственный способ сделать это - использовать конструктор new Promise:

console.log('start');
const getProductId = () => new Promise(res => setTimeout(res, 1500, 5));
getProductId().then(res => console.log(res));

Время использования Promise.resolve - это если у вас уже есть значение (синхронно) и вы хотите превратить его в Promise, который вы можете вызвать .then,Например, используя Promise.resolve('begin') в качестве начального значения для аккумулятора в следующем коде, можно создать простую цепочку Promise с помощью reduce:

const prom = ['foo', 'bar', 'baz']
  .reduce((lastProm, str) => (
    lastProm.then((lastStr) => {
      console.log(lastStr);
      return str;
    })),
    Promise.resolve('begin')
  );
  
prom.then((lastStr) => {
  console.log(lastStr);
  console.log('end');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...