解析异步问题:为何数据请求成功前执行代码会出错及解决方案

2024-06-07
来源:网络整理

1. 异步问题

所谓异步,就是指当我们向数据库请求数据的时候,由于网速等各方面的原因,数据返回的时间是不确定的,我们如果想使用这个数据,必须要等到数据返回成功之后才能使用,否则就会报错。

1-1、问题描述

如下:

很多同学以为代码是从上往下执行的,请求会先执行成功,然后才会执行第11行的代码,商品数量也应该为2个。然而我们的第11行打印出来的却是0,这是为什么呢?

这个错误的原因在于我们没有在请求成功的时候写入数据,正确的数据请求返回是异步的,我们并不知道请求什么时候成功,但是我们的第11行代码不会等我们的数据请求成功后才执行,所以第11行的打印是0而不是2。

1-2,解决方案

为了解决上述问题,将使用数据的地方写入数据请求成功即可。

这样可以解决异步的问题,但是如果我们有很多地方要用到请求成功的数据怎么办呢?我们总不能把所有的代码都写在数据请求成功的地方吧。这时候就需要使用and来解决这个问题。

二、使用并将异步改为同步

所谓同步,就是我们从上到下保持代码正常运行。但是,只要有数据请求,就会有异步的问题。所以这里就得想办法把异步改成同步。这就需要和。

代码如下:

可以看出我们不需要把使用数据的代码写到请求成功里面,这样代码从上到下读起来就跟平常一样了。

翻译过来就是等待的意思。其实这里的意思就是我们等待数据请求完成后,将数据的返回结果赋值给res,然后数据请求成功之后,我们就可以正常使用数据请求返回的结果了。

防范措施

我们在小程序中使用 和 的时候,一定要成对出现。

将其放在函数名称之前和数据请求之前。

并检查:增强编译

现在最新版的小程序开发者工具好像已经支持这个方法了,不勾选增强编译好像也是可以的。不过为了安全起见,还是勾选增强编译比较好。

3. 回调地狱

比如我们有这样的需求:

用户注册时,首先要检查自己是否注册过,若没有注册过,可以重新注册,注册成功后才可以查看商品列表。

3-1、问题描述

我们在这里为您分析需求

如果你只看流程图,你肯定会觉得很简单;但是你必须认识到一个现实,就是这里面的环节。

也就是我们最后如果想把商品展示在页面上,必须靠每次请求成功,现在只有3个请求,但是如果有100个,一层又一层,最后你就手忙脚乱了,这就是回调地狱。

3-2、回调地狱代码

简单说一下,你可能还没有意识到回调地狱的坏处。那我就用代码来实现我们上面的需求吧。

假设我们有

比如我们要注册一个叫“小石头”的用户

步骤 1:检查您是否已注册

可以看出返回的数字为0,也就是说还未注册过。

第 2 步:注册成为用户

可以看到我们已经注册成功了,但是此时代码已经嵌套了。

步骤 3:搜索产品

由于我们在第二步已经成功注册了‘小石头’,因此我们在这一步再注册一个‘大石头’,注册成功后就可以查询产品了。

首先我们看一下代码,此时已经嵌套了三层,代码已经变得有些乱了。

查看结果

可见我们已经能够成功查询到商品数据了。

这里嵌套只有三层,看上去还可以,如果继续一层层嵌套会怎么样?代码会越来越乱。为了避免回调地狱,我们还可以使用 和 来改造代码。

四、结合解决回调地狱

首先看一下修改后的代码

可以看到代码非常简单,逻辑就是从上到下正常执行代码。

为了更加明显的比较。

到这里就结束了,你是不是感觉用了它之后,你的代码变得简洁了很多呢?跟着石头哥的这篇文章来体会一下吧。

分享