Функция задержки в обещании объяснения кода JavaScript - PullRequest
4 голосов
/ 27 июня 2019

Я не спрашиваю о том, как написать функцию задержки, потому что на этот вопрос ответили, я просто не понимаю сам код. Я не понимаю, зачем нам нужна функция, возвращающая другую функцию? Как мы получаем данные
Я аннотировал код с моими комментариями. Если вы запустите его в консоли, он должен работать. Я просто ищу объяснение новичка, почему здесь нужен этот синтаксис карри.

// a function
function delay(duration) {
  // why do we return here !! 
  // this args are the data.json() 
  // but how do we have access to it?? I don't see anywhere in the code that we are calling delay(data => data.json())
  // I know that .then calls the function for you with data.json() but that only if the function doesn't have a paramets for example doing just then(delay) but we are using a paramaeter here which is the 1000
  return function(...args){
    // so we return a new promise that resolves after sometime, this make sense.
    // but I don't understand all these returns.
    return new Promise(function(resolve, reject){
      setTimeout(function(){
        resolve(...args);
      }, duration)
    });
  };
}


const endpoint = 'https://pokeapi.co/api/v2/pokemon/ditto/'
const prom1 = fetch(endpoint)
              .then(data => data.json())
              .then(delay(2000))
              .then(console.log)


Ответы [ 2 ]

3 голосов
/ 27 июня 2019

... почему нам нужна функция, возвращающая другую функцию?

Так что, когда вы делаете

.then(delay(2000))

... it вызывает delay(2000), получает функцию, которая добавит эту задержку, и добавляет ее в цепочку обещаний. Позже , когда цепочка установится, эта функция будет вызываться с аргументом then callbacks receive (значение выполнения), который она получает как единственную запись в своем ...args параметре rest. Затем он будет ждать duration миллисекунд, прежде чем выполнить свое обещание с этим значением выполнения и позволить цепочке продолжить.

Если delay вернет свое обещание напрямую, это обещание перейдет к then, и время ожидания начнется преждевременно (до того, как выполнение достигнет этой точки в цепочке). Он также «съел бы» значение выполнения, проходящее через цепочку, поскольку у него не было бы этого значения, чтобы использовать его при выполнении своего обещания.

Если бы вы только что имели:

function delay(duration, ...args) {
  return new Promise(function(resolve, reject){
    setTimeout(function(){
      resolve(...args);
    }, duration)
  });
}

тогда вам придется использовать это так:

.then(delay.bind(null, 2000))

, что более неудобно (и все же создает и предоставляет функцию, поскольку именно это bind делает).


Примечание: у этой реализации delay нет оснований использовать отдых и распространение. Используется только первый аргумент resolve (любые другие полностью игнорируются), а обработчики then получают только один аргумент. Так может быть:

function delay(duration) {
  return function(fulfillmentValue){
    return new Promise(function(resolve, reject){
      setTimeout(function(){
        resolve(fulfillmentValue);
      }, duration)
    });
  };
}

... хотя я, вероятно, использовал бы функции стрелок для всех трех функций, которые создает delay.

1 голос
/ 27 июня 2019

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

Поэтому, когда вы говорите then(delay(2000)), вы должны убедиться, что delay(2000) возвращает функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...