Promise

Всем привет. Никак не могу понять как работают promise, как минимум из-за того, что никак не могу сделать какой либо пример на нем(

Вот например задача: в функцию приходит объект в котором массивы , нужно проверить что это объект, потом пройтись по этим массивам и с задержкой вывести все значения.

У меня промис выдает ошибку - “Cannot read property ‘then’ of undefined”.

function load(url) {
  if (typeof url) {
    for (let key in url) {
      return new Promise(function(resolve, reject) {
        if (Array.isArray(url[key])) {
          return resolve(1);
        } else {
          return reject(new Error("не удалось выполнить..."));
        }
      });
    }
  }
}

load().then(function(res) {
// тут как я понял делаем задержку?
  console.log(res);
});
load().catch(function(err) {
  console.log(err.message);
});

load({
  currentYearDate: ["text", "text1"],
  previousYearDate: ["teeeeext1"]
});

Вот ссылка на codesandbox - https://codesandbox.io/s/nm0nyxn6l

Тебе не понятен урок по промисам на learn.javascript.ru?
Если промис выполняется успешно, то вызывается один callback (функция обратното вызова), а если выполняется с ошибкой - то вызывается другой колбэк.

1 лайк
load().then(function(res) {
// тут как я понял делаем задержку?
  console.log(res);
});

Тут ты вызываешь функцию load вообще без аргументов, у тебя цикл не отрабатывает, никакого промиса не возвращается. То же самое в случае с catch. А потом после этого ты вызываешь load со своим объектом, и этот вызов как раз и вычисляется в промис.

Сохрани получившийся промис и на нем вызывай then / catch:

function load(url) {
  if (typeof url) {
    for (let key in url) {
      return new Promise(function(resolve, reject) {
        if (Array.isArray(url[key])) {
          return resolve(1);
        } else {
          return reject(new Error("не удалось выполнить..."));
        }
      });
    }
  }
}

const iPromiseYouToLoad = load({
  currentYearDate: ["text", "text1"],
  previousYearDate: ["teeeeext1"]
});

iPromiseYouToLoad.then(function(res) {
  console.log(res);
});

iPromiseYouToLoad.catch(function(err) {
  console.log(err.message);
});
1 лайк

Вот только что нашел (еще не смотрел) Запись вебинара на тему “Асинхронное программирование в JavaScript. Promise & Deferred” от Дмитрия Охрименко.

1 лайк

Вообще я пытался понять эту тему по статье тут - https://habr.com/company/zerotech/blog/317256/

Кажется у меня получилось сделать то, что я хотел. Оказывается мне нужна была “промисификация” как написано тут - learn.javascript.ru.

В конце концов получилось вот так

function load(url) {
  if (typeof url) {
    for (let key in url) {
      var myPromice = new Promise(function (resolve, reject) {
        if (Array.isArray(url[key])) {
          resolve(url[key]);
        } else {
          return reject(new Error("не удалось выполнить..."));
        }
      });


      myPromice.then(
        response => {
          response.map(function(massage, key){
             setTimeout(() => console.log(`Fulfilled: ${massage}`), 2000 + (2000 * key + 1));
          });
        },
        error => console.log(`Rejected: ${error}`)
      );
    }
  }
}

load({
  currentYearDate: ["text", "text1"],
  previousYearDate: ["teeeeext1"]
});

Всем спасибо, все ссылки я сегодня посмотрю и буду углубляться в эту тему.