让我们来创建一个JavaScript Wait函数

时间: 2017-11-23阅读: 6023标签: 函数

Async/await以及它底层promises的应用正在猛烈地冲击着JS的世界。在大多数客户端和JS服务端平台的支持下,回调编程已经成为过去的事情。

当然,基于回调的编程很丑陋的。

如果您还没有使用过,那么开始接触并使用async/await和promise是非常有必要的。在async/await之前,我并没有十分痴迷于promise,就像您看到的下面的代码:


比回调地狱好点,但并不美观

关于async/await有很多很好的介绍,所以在这里就不再做过多讨论,只占用15秒:您使您的函数返回一个promise,然后使用await(内置了一个异步函数)来调用这个promise。

These examples will also make use of a new-ish JS feature, arrow functions. 这些示例还将使用一个新的JS特性,箭头函数。如果您习惯于下面这种写法:

function(a) { return console.log(a) }

现在改为:

(a) => console.log(a)

这样,我们就可以创建我们的Wait函数了。

Wait函数(在某些环境中也叫Sleep函数)很容易理解、使用和创建。顾名思义,就是我们想让程序等待一段时间。

只是设置一段延时来执行我们的promise。我们可以自定义我们等待的时间ms。

var wait = ms => new Promise((r, j)=>setTimeout(r, ms))

wait(2000)会返回一个promise,然后在2000ms后执行(2s)。

// Promise syntax
var prom = wait(2000)  // prom, is a promise
var showdone = ()=>console.warn('done')
prom.then(showdone)
// same thing, using await syntax
await wait(2000)
console.warn('done')

使用async/await语法要比promise的.then()更优雅。我们用一个立即执行函数包裹它,以便简洁。

(async () => { await wait(2000); console.warn('done') })()

或在常规代码中

var x = 1
var y = 2
await wait(2000)
console.warn(x)

What if we want to wait on an event, instead of just waiting x ms of time? 如果我们想等待某个事件,而不只是等待多少毫秒的延时呢?只需要控制这个promise什么时候执行就行了。

我们甚至可以设置调用的超时时间,如果事件永远不会发生,代码就不会一直等待。

假设在一个web页面中,我们想要等待一个内容为“Hello World”的DOM元素。我们会每100ms检查一次,并在2s后超时退出。

<div id=a>s</div>
<script>
var e = document.querySelector('#a')

  var waitForHello = timeoutms => new Promise((r, j)=>{
    var check = () => {
      console.warn('checking')
      if(e.innerHTML == 'Hello world') 
        r()
      else if((timeoutms -= 100) < 0)
        j('timed out!')
      else
        setTimeout(check, 100)
    }
    setTimeout(check, 100)
  })
//setTimeout(()=>{e.innerHTML='Hello world'}, 1000)
  (async ()=>{
    a.innerHTML = 'waiting..'
    waitForHello(2000)
  })()

</script>

不注释掉setTimeout那一行,就会在1s后将这个DIV的内容设置为“Hello World”,否则将会超时退出。

如您所见,async/await为您的代码创造了无限的可能性。

原文链接

站长推荐

1.阿里云: 本站目前使用的是阿里云主机,安全/可靠/稳定。点击领取2000元代金券、了解最新阿里云产品的各种优惠活动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各类产品的最新活动,优惠券领取点击进入

3.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/158

理解与使用JavaScript中的回调函数

在JavaScript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用。既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回。

10个非常实用的Js工具函数

生成一周时间new Array 创建的数组只是添加了length属性,并没有实际的内容。通过扩展后,变为可用数组用于循环,类型判断判断核心使用Object.prototype.toString,这种方式可以准确的判断数据类型。

Javascript之尾调用

尾调用是函数式编程的一个重要的概念,本篇文章就来学习下尾调用相关的知识。有说过在一个函数中输出一个函数,则这个函数可以被成为高阶函数。本文的主角尾调用和它类似,如果一个函数返回的是另一个函数的调用结果,那么就被称为尾调用。

javascript中的匿名方法(函数)是什么?

方法(method)是通过对象调用的javascript函数。也就是说,方法也是函数,只是比较特殊的函数。JavaScript中的匿名方法即匿名函数是没有函数名称的函数。

JavaScript中怎么调用函数?

JavaScript怎么调用函数?其实在JavaScript中函数有4种调用方式。下面本篇文章就来给大家介绍一下JavaScript函数的4种调用方式,希望对大家有所帮助。

CSS的var()函数怎么用?

CSS中的var()函数可用于插入自定义属性(有时称为“css变量”)的值,而不是插入其他属性值的任何部分。随着sass,less预编译的流行,css也随即推出了变量定义var函数。var()函数,就如同sass和less等预编译软件一样,可以定义变量并且进行对应的使用。

如何实现 lodash.get 函数及可选链操作简化取值

lodash 基本上成为了 js 项目的标配工具函数,广泛应用在各种服务端以及前端应用中,但是它的包体积略大了一些。对于服务端来说,包的体积并不是十分的重要,或者换句话说,不像前端那样对包的体积特别敏感,一分一毫都会影响页面打开的性能,从而影响用户体验。

JavaScript高阶函数

Javascript中的函数本质上都指向某个变量,既然变量可以指向函数,函数的参数可以接受变量,那么函数是不是可以可以作为另一个函数的入参?因为Javascript是一门弱类型语言,不会对函数输入值和函数的输出值进行强定义和类型检查

javascript函数记忆

记忆的定义基本上描述了实施该技术的有用方案。 当您拥有一个昂贵的函数时,如果给定相同的参数,该函数将始终导致相同的值,则缓存结果并在下次调用它时返回缓存的值非常有效。 这样,宝贵的时间不会浪费在重新计算值上

Js中函数的5个高级技巧

函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。函数对任何一门语言来说都是一个核心的概念,在javascript中更是如此。本文将深入介绍函数的5个高级技巧。

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广