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