微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – ES6承诺超时间隔

我正在尝试将我的一些代码转换为承诺,但我无法弄清楚如何在承诺中链接新的承诺.

我的promise函数应该每隔一秒左右检查一个数组的内容,如果里面有任何项目应该解决.否则它应等待1秒并再次检查,依此类推.

@H_502_6@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”:

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

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

解决方法:

setTimeout本身具有可怕的链接错误处理特性,所以总是wrap it

@H_502_6@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闪耀的一个很好的例子:

@H_502_6@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(),因为异步函数隐式执行此操作.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐