我是业余编程爱好者,写代码的时间不多,每次写还要从掌握的近十种语言里现调取知识(现在脚本写的多,正儿八经的语言不写了),非常痛苦。JavaScript是函数式的语言,和我们一般的观念认识不大一样,写起来就麻烦。让我一直觉得困难的就是延时函数。

Background

以前实现延时是用setTimeout(),逻辑类似下面的样子

1
2
3
4
function next() {
something();
setTimeout('next()', 1 * 1000);
}

这样每次执行自己,实在是让人不爽,我还记不住。

2017年的解决方案

详细的讨论见stackoverflow上的讨论,代码是这样的

1
2
3
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

然后await sleep(1000)就可以睡一秒。需要强调的是,使用await sleep()必须在async的函数里才能用。

箭头函数

箭头函数是ES6里有的,上面的代码里也用到了。要用sleep()必须在async的函数里,如果我要把async和箭头函数结合,该怎么做呢?

1
2
3
(async () => {

})();

很好很极客。其实就是立即调用函数表达式,缩写IIFE

实例

我发现一览阅读收录了我的Blog,不知是哪位朋友提交的还是他们抓取的。

总之,感谢您🙏

我非常邪恶的,想批量给自己点赞。于是有了如下代码

1
2
3
4
5
6
7
8
9
10
11
12
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

(async () => {
var eles = document.querySelectorAll("span.icon-thumbs-up");

for (var i = 0; i < eles.length; ++i) {
eles[i].click();
await sleep(5000);
}
})();

注意

这里的asyncawait实际是语法糖,是对Promise的包装。

Reference

  1. Firefox 52支持Async/Await
  2. ES6异步操作和async函数