那么如何在承诺中添加延迟[重复]

Posted

技术标签:

【中文标题】那么如何在承诺中添加延迟[重复]【英文标题】:How to add delay to promise inside then [duplicate] 【发布时间】:2016-12-21 17:17:05 【问题描述】:
fetch()    
    return axios.get('/rest/foo')
        //.then(response => throw new Error(response)) // Uncomment to test network error
        //.then( <<add delay here>> ) // Uncomment to simulate network delay

如何在后者中添加延迟然后阻塞,以便在将控制权传递给 fetch 调用者然后阻塞之前等待指定的时间量?

【问题讨论】:

【参考方案1】:

从等待的 then 处理程序返回一个承诺:

.then(() => new Promise(resolve => setTimeout(resolve, 1000)))

如果你想“传递”promise的值,那么

.then(x => new Promise(resolve => setTimeout(() => resolve(x), 1000)))

为了避免到处出现这种样板,编写一个实用函数:

function sleeper(ms) 
  return function(x) 
    return new Promise(resolve => setTimeout(() => resolve(x), ms));
  ;

然后像 in 一样使用它

.then(sleeper(1000)).then(...)

【讨论】:

感谢您的解决方案,对我的情况进行了细微修改,效果很好:在异步函数中,您可以写:await new Promise(resolve =&gt; setTimeout(resolve, 1000)) 从 Node.js 16 开始,也可以使用Timers Promises API。【参考方案2】:

这是您创建新承诺的罕见情况之一:

fetch()    
    return axios.get('/rest/foo')
        .then(value => new Promise(resolve => 
                setTimeout(() => 
                    resolve(value);
                , delayInMilliseconds);
            )
        );

但不是一次性的,我有(事实上,确实有)一个实用功能:

function wait(ms, value) 
    return new Promise(resolve => setTimeout(resolve, ms, value));

然后:

fetch()    
    return axios.get('/rest/foo')
        .then(value => wait(delayInMilliseconds, value));


这是带有 TypeScript 类型的 wait(感谢 MEMark!):

function wait<T>(ms: number, value: T) 
    return new Promise<T>((resolve) => setTimeout(resolve, ms, value));

【讨论】:

使用 TypeScript 类型:function wait&lt;T&gt;(ms: number, value: T) return new Promise&lt;T&gt;((resolve) =&gt; setTimeout(resolve, ms, value));

以上是关于那么如何在承诺中添加延迟[重复]的主要内容,如果未能解决你的问题,请参考以下文章

你如何将 setTimeout 包装在一个承诺中[重复]

如何重复一系列承诺中的步骤以及如何从失败的步骤中恢复?

Javascript,如何等待多个承诺[重复]

如何在Javascript中制作精确的睡眠功能,可能使用承诺?

使用 Promise.all 时承诺之间的延迟

如何解决Arango查询承诺错误? [重复]