gpt4 book ai didi

javascript - ES6 promise 超时间隔

转载 作者:搜寻专家 更新时间:2023-10-31 22:44:35 24 4
gpt4 key购买 nike

我正在尝试将我的一些代码转换为 promise,但我不知道如何在 promise 中链接一个新的 promise。

我的 promise 函数应该每秒检查一次数组的内容,如果里面有任何项目,它应该解析。否则它应该等待 1s 并再次检查等等。

function get(){
return new Promise((resolve) => {

if(c.length > 0){
resolve(c.shift());

}else{
setTimeout(get.bind(this), 1000);
}

});

}


let c = [];

setTimeout(function(){
c.push('test');
}, 2000);

这就是我期望我的 get() promise 函数工作的方式,它应该在最多 2 或 3 秒后打印“test”:

get().then((value) => {
console.log(value);
});

显然它不起作用,什么都没有打印

最佳答案

setTimeout 本身具有糟糕的链接和错误处理特性,因此总是 wrap it :

const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

function get(c) {
if (c.length) {
return Promise.resolve(c.shift());
}
return wait(1000).then(() => get(c)); // try again
}

let c = [];
get(c).then(val => console.log(val));
wait(2000).then(() => c.push('test'));

虽然你没有问,但为了其他人的利益,这是一个很好的例子,其中 async/await 闪耀:

const wait = ms => new Promise(r => setTimeout(r, ms));

async function get(c) {
while (!c.length) {
await wait(1000);
}
return c.shift();
}

let c = [];
get(c).then(val => console.log(val));
wait(2000).then(() => c.push('test'));

请注意这次我们不需要 Promise.resolve(),因为 async 函数会隐式执行此操作。

关于javascript - ES6 promise 超时间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47003789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com