承诺JavaScript代码说明中的延迟功能

时间:2019-06-27 16:23:59

标签: javascript promise

我没有问如何编写延迟函数,因为已经回答了这个问题,我只是不理解代码本身。 我不明白为什么我们需要让一个函数返回另一个函数? 我们如何获取数据
我已经用注释对代码进行了注释。 如果您在控制台中运行它,它将正常工作。我只是在寻找新手的解释,以了解为什么我们在这里需要这种简单易用的语法。

// 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 个答案:

答案 0 :(得分:3)

  

...为什么我们需要让一个函数返回另一个函数?

所以当你这样做

.then(delay(2000))

...它调用 delay(2000),获取将添加该延迟的函数,并将其添加到promise链。 稍后,当链建立后,该函数将使用参数then调用,回调函数将接收(实现值),它作为...args休止符中的唯一条目而接收参数。然后它将等待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 :(得分:1)

您必须将一个函数传递给then()(在然后发生之前必须发生的所有事情都将被调用)。

因此,当您说then(delay(2000))时,必须确保delay(2000)返回一个函数。