同学们大家好,我是小伊同学,前面我们学习了小程序中Js的基本知识,在这些基础上Js中还有很重要的一部分内容就是小程序的API,本节我们就首先来学习一下API的类型和语法结构。
首先,我们先来介绍一下,什么是API。API的英文全称是ApplicationProgramming Interface,翻译成中文叫做应用程序编程接口。
API实际上是一些预先定义的函数,即一些特定的功能模块。这些模块能够使得开发人员直接使用,从而获取这一功能。开发人员不需要指导这个功能具体是如何实现的,更不需要看到代码,只要在需要的地方直接使用即可。这种方式极大地降低了开发难度和工作量,但相应也牺牲了一部分灵活性。但对于其带来的好处来说,这一部分缺点几乎可以被忽略。
小程序开发框架提供丰富的微信原生 API,可以方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等,详细介绍同学们可以参考API文档。
通常,在小程序API有以下几种类型:
- 事件监听API 在微信小程序中规定以 on 开头的 API 用来监听某个事件是否触发,如:wx.onCompassChange等。这类API接收一个回调函数作为参数,当事件触发时会调用这个回调函数,并将相关数据以参数形式传入。
- 同步API 微信规定,以 Sync 结尾的 API 都是同步API,比如在处理存储方面的api,但是并不绝对,此外还有一些api也是同步的,详情参见API文档中的说明。同步API 的执行结果可以通过函数返回值直接获取,如果执行出错会抛出异常。
- 异步API 我们常用的大多数 API 都是异步 API。这类 API 接口通常都接受一个 Object 类型的参数,这个参数都支持按需指定一些字段来接收接口调用结果。
需要说明的是,同步API和异步API是相互对立的两种类型,而事件监听API是独立于两者的一种定义方式,其与后两者并不是并列无交集的。
对于同步API,是说在执行到这个api的地方后,系统主线暂停,等待执行完api后再继续向下运行。而异步api则是当执行到api后,系统代码并不停止运行,而是继续向下,对于api的部分,系统会相当于启动一个分支进行执行,这个分支和原本的主线是分离的,对于分支的运行结果,主线是并不知道的,也无法获知其在什么时候能够运行完毕的。因此,我们在使用的时候,要尽量避免因为异步api带来的代码错误或数据延迟。
那么我们应该如何避免呢?下面我们就来介绍一下异步api的基本结构,因为在本项目中,我们使用到的全部都是异步api,因此,另外两种的细节我们不做过多介绍了,想学习的同学可以通过微信开发者文档进行学习。如右图所示,就是刚才我们讲的异步api执行过程。
对于异步api,不同的api的内容不同,但主要语法格式如下所示。在api的内容部分,可以有三部分代码,分别是success部分、fail部分和complete部分。这三部分我们称之为api的回调函数,即在api执行到相应节点时会返回到这里执行这些函数。其中,success为接口调用成功的回调函数,fail为接口调用失败的回调函数,complete为接口调用结束的回调函数,它不管调用成功还是失败都会执行。
同学们请看中间的示例,这是一个微信登录的api,其功能是使小程序获得用户的部分与身份有关的信息。当登录成功时,执行success部分代码。当登陆失败后,执行fail部分的代码。当api调用完成后,无论成功还是失败,都会执行complete部分的代码。
这三部分的执行顺序为:success和fail部分二选一执行,根据api的调用结果由系统自动进行判断。执行其中一部分代码后再执行complete部分代码,每段代码内部均为顺序执行,除非再次调用异步api又会产生分支。
因此,回到之前那个问题,如何避免因为api异步带来的代码错误或数据延迟。那么我们的思路就是将主线任务转移到支线上,使主线任务到api调用就结束了,而支线任务中,通过将代码写在上面这三部分,从而使得代码顺序执行,无论是这三部分的哪一部分,在开始执行之前,能够确保已经知道api的调用结果了。当然,这三部分都不是必须的,不写也可以,根据功能需求填写使用。
对于上述三个回调函数:success,fail和complete函数,调用时可以传入一个Object类型参数,这个Object类型中有什么内容,我们又为什么需要这样一个参数呢?
我们已经知道这三部分分别在api调用成功、失败和完成时执行,但是我们是不是还应该知道一些具体信息呢?比如调用失败,如果可以知道失败原因,是不是就可以继续编写代码解决这个问题呢,比如重试一次。这就是我们使用这个参数的意义。通常这个参数中会包含两部分,一个是错误信息,其属性为errmsg,类型为string,另一个是errcode,类型为number,代表错误码。如果成功,那么这两部分则分别为ok和0。此外,这个参数中还可能包含一些其他信息,比如网络请求的api,获取用户身份信息的api,在成功时要能够看到请求到的数据,那么也会通过这个参数来传递。
一般,我们将这个参数写作res,是response的缩写,我们在每一部分中使用res加点加属性名称就能够访问,例如这里在执行失败的时候,我在调试窗口打印输出了一些错误信息。console.log为打印函数,将打印括号中变量的值,括号中我使用res加点加属性名访问了错误信息。
对于不同的api,参数中的信息也各不相同,大家在使用时可以通过微信开发者文档去查询一下。另外,这些参数也不是一直不变的,微信团队也会对其进行修改增删,因此,为了保证我们在编写代码的时候不出问题,建议大家使用前先查阅该api的使用说明。
日拱一卒,功不唐捐。涓流所积,终成沧海。