我正在尝试将我的一些代码转换为承诺,但我无法弄清楚如何在承诺中链接新的承诺.
我的promise函数应该每隔一秒左右检查一个数组的内容,如果里面有任何项目应该解决.否则它应等待1秒并再次检查,依此类推.
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(),因为异步函数隐式执行此操作.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。