当前位置: 首页 > 知识库问答 >
问题:

javascript - js中的异步函数中如何阻止下一步执行?

孙震博
2024-04-08
 getPlat({"tenantId":row.id}).then(response=>{                console.log(response.rows.length)                if(response.total>0){                     this.$set(this.form2,"platAddr",response.rows[0].platAddr)                    this.$set(this.form2,"platDesc",response.rows[0].platDesc)                    this.$set(this.form2,"platDomain",response.rows[0].platDomain)                    this.$set(this.form2,"platLogo",response.rows[0].platLogo)                    this.$set(this.form2,"platName",response.rows[0].platName)                    this.$set(this.form2,"id",response.rows[0].id)                }else{                    console.log("未设置平台")                }

返回的数据结构如下:

{"total":0,"rows":[],"code":200,"msg":"查询成功"}

如上述代码加了IF判断,但是在浏览器中还是报错。

Uncaught (in promise) TypeError: response.rows[0] is undefined    handlePlant index.vue:401    promise callback*handlePlant index.vue:400    click index.vue:350    VueJS 4    handleClick element-ui.common.js:9457

怎么阻止?

共有4个答案

公孙霖
2024-04-08

handlePlant index.vue:401 是不是你这边的业务代码位置?
点一下后面的 index.vue:401 就会在 devTools 中定位到异常处了,看看代码是否有问题。也有可能缓存之类的导致。

如果实在排查不了可以考虑使用 可选链运算符(?.) 来处理。

- this.$set(this.form2, "platAddr", response.rows[0].platAddr)+ this.$set(this.form2, "platAddr", response.rows[0]?.platAddr)
娄嘉石
2024-04-08

报错说response.rows[0]未定义 那你判断response.rows[0]是否存在啊

巫马昆杰
2024-04-08

已经解决,采用response.total > 0
但是之前也试过,看样子应该是浏览器缓存影响的。

松霖
2024-04-08

在JavaScript中,异步函数(如使用.then()方法的函数)并不会直接阻止后续代码的执行,而是允许代码在等待某个操作(如网络请求)完成时继续执行。在你的代码中,getPlat函数可能还没有完成其异步操作(例如,它可能还在等待服务器的响应),而你的代码已经试图访问返回的结果了。

在你的例子中,错误消息Uncaught (in promise) TypeError: response.rows[0] is undefined表明response.rows数组是空的(或者response.rows本身就是undefined),因此尝试访问response.rows[0]时会导致错误。这可能是因为getPlat函数的异步操作还没有完成,或者服务器返回的数据中没有rows属性,或者rows数组是空的。

为了解决这个问题,你可以在访问response.rows[0]之前先检查response.rows是否存在并且长度大于0。这样,如果response.rows是空的,你的代码就不会尝试访问response.rows[0],从而避免了错误。

以下是一个修改后的代码示例:

getPlat({"tenantId":row.id}).then(response=>{    console.log(response.rows.length)    if(response.total>0 && response.rows && response.rows.length > 0){         this.$set(this.form2,"platAddr",response.rows[0].platAddr)        this.$set(this.form2,"platDesc",response.rows[0].platDesc)        this.$set(this.form2,"platDomain",response.rows[0].platDomain)        this.$set(this.form2,"platLogo",response.rows[0].platLogo)        this.$set(this.form2,"platName",response.rows[0].platName)        this.$set(this.form2,"id",response.rows[0].id)    }else{        console.log("未设置平台")    }})

在这个修改后的代码中,我添加了一个额外的条件response.rows && response.rows.length > 0来检查response.rows是否存在并且长度大于0。这样,只有当response.rows存在并且长度大于0时,代码才会尝试访问response.rows[0],从而避免了错误。

 类似资料:
  • 问题内容: 查看此代码: 正如您在控制台中看到的那样,“动画”功能是异步的,它“分叉”了事件处理程序块代码的流程。事实上 : 遵循块代码的流程! 如果我希望以此行为创建自己的代码,该如何使用javascript/jquery进行创建?我认为这是不使用的策略 问题答案: 您不能创建真正的自定义异步函数。您最终将不得不利用本机提供的技术,例如: 一些HTML5 API,例如文件API,Web数据库AP

  • 经常看到的一个题目,特此求解 gpt的写法是: async/await callback function

  • 问题内容: 我想每60秒在Python上执行一个函数,但是我不想同时被阻塞。 如何异步进行? 使用此代码,函数f在20秒time.time中每3秒执行一次。最后,它给出了一个错误,我认为这是因为threading.timer尚未被取消。 如何取消呢? 提前致谢! 问题答案: 您可以尝试threading.Timer类:http : //docs.python.org/library/threadi

  • 本文向大家介绍再谈Javascript中的异步以及如何异步,包括了再谈Javascript中的异步以及如何异步的使用技巧和注意事项,需要的朋友参考一下 为什么需要异步?why?来看一段代码。 问题1:   这段代码的意思是执行100...次后再执行alert,这样带来的问题是,严重堵塞了后面代码的执行,至于为什么,主要是因为JS是单线程的。 问题2:   我们通常要解决这样一个问题,如果我们需要在

  • 本文向大家介绍请你说一下阻塞,非阻塞,同步,异步相关面试题,主要包含被问及请你说一下阻塞,非阻塞,同步,异步时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 阻塞和非阻塞:调用者在事件没有发生的时候,一直在等待事件发生,不能去处理别的任务这是阻塞。调用者在事件没有发生的时候,可以去处理别的任务这是非阻塞。 同步和异步:调用者必须循环自去查看事件有没有发生,这种情况是同步。调用者不用自己去查看

  • 问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调