... почему нам нужна функция, возвращающая другую функцию?
Так что, когда вы делаете
.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
.