异步调用导致的不同步问题

业务场景:点击一个按钮的时候保存数据,同时打开一个弹窗带出保存的数据

基于这样的业务场景,最近遇到一个问题,是在ie11才发现的,点击按钮时候,后台打断点加数据库查询都验证数据是保存正确的,不过已经保存的数据是带不到弹窗页面的,问题比较奇怪,排查了挺长时间,最开始因为在ie才能重现的问题,在极速模式的360浏览器是没问题的,而且第一次点击时候没带出数据,第二次点击时候才可以带出数据,然后很容易让人联想到ie的缓存问题,不过调了大半天
加上ajax不缓存的代码,已经改成post请求,或者get请求连接后面加上一个时间戳参数都不奏效

$(function(){
            //ajax不缓存请求结果
            $.ajaxSetup({cache: false});
        });

然后经过和同事沟通,才发现自己跟错了方向,经过检查发现保存的方法是用异步的,问题就出现在这里了,首先验证是不是由于异步导致的,在保存数据代码和打开弹窗页面的代码之间加一个alert提示,发现果然,关联alert弹窗提示之后,数据正常带出,所以确定是因为异步导致的

保存的代码,注意async:true,,这里是异步的,之前可能是考虑性能问题,改成异步的

$.ajax({
            url:'${root}/saveOrUpdate.do',
            type:"post",
            async:true,
            success:function(result){
            ...
            }
        });  

所以经过一番调试,给出自己的方案,解决方法是用回调函数:

保存函数:

function saveRecord(seq,callback){
    $.ajax({
            url:'${root}/saveOrUpdate.do',
            type:"post",
            async:true,
            success:function(result){
                if(callback!=undefined){
                        callback(true);
                }
            }
        });
}
    //保存成功,才会打开弹窗
    function main(seq){
        saveRecord(seq,callbackFunction);

    }

    /*保存时的回调函数*/
     function callbackFunction(saveSuccess){
        if(saveSuccess){
            //省略打开弹窗代码
        }
     }

原文地址:https://www.cnblogs.com/mzq123/p/11402728.html

时间: 2024-11-09 06:27:10

异步调用导致的不同步问题的相关文章

接口异步调用导致的一个低概率问题引发的思考。

最近5个月接触到的异步调用占工作以来接触到的一半以上,这些异步调用都是消费消息的方式. 应用A在处理完业务后,需要调用应用B的接口做信息同步(记录数据或者更新数据),有两种方式: 一般情况是采用同步方式,等待应用B的接口处理完后,拿到返回值,继续后续处理.这样的好处是可以根据应用B的接口返回值来做接下来的数据处理:如果B失败了,可以数据回滚:或者使用应用B的接口返回数据继续业务处理. 还有一种比较少的方式是异步:有发消息的,也有往系统插入一条定时任务数据的.这种方式的好处时不用等待调用方处理,节

spring-boot实战【10】【转】:Spring Boot中使用@Async实现异步调用

什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行:异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序. 同步调用 下面通过一个简单示例来直观的理解什么是同步调用: 定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

spring boot 1.5.4 定时任务和异步调用(十)

上一篇:spring boot1.5.4 统一异常处理(九) 1      Spring Boot定时任务和异步调用 我们在编写Spring Boot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信.邮件之类的操作,也可能会定时地检查和监控一些标志.参数等. spring boot定时任务spring-boot-jsp项目源码: https://git.oschina.net/wyait/springboot1.5.4.git 1.1  创建定时任务 在Spring Boot中编写定时

如何在Spring异步调用中传递上下文

以下文章来源于aoho求索 ,作者aoho 1. 什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行.异步调用指,在程序在执行时,无需等待执行的返回值即可继续执行后面的代码.在我们的应用服务中,有很多业务逻辑的执行操作不需要同步返回(如发送邮件.冗余数据表等),只需要异步执行即可. 本文将介绍 Spring 应用中,如何实现异步调用.在异步调用的过程中,会出现线程上下文信息的丢失

spring boot中使用@Async实现异步调用

什么是“异步调用”? “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行:异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序. 同步调用 下面通过一个简单示例来直观的理解什么是同步调用: 定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内) package com.dxz.demo1; import java.util.Random; import org.sprin

同步调用和异步调用同时存在导致的混乱

其实在Promise之外也存在这个问题,这里我们以一般的使用情况来考虑此问题.这个问题的本质是接收回调函数的函数,会根据具体的执行情况,可以选择是以同步还是异步的方式对回调函数进行调用.下面我们以 onReady(fn) 为例进行说明,这个函数会接收一个回调函数进行处理. mixed-onready.js function onReady(fn) { var readyState = document.readyState; if (readyState == 'interactive' ||

将同步调用转成异步调用?

有时候同步调用和异步调用同时存在的时候,难免出现混乱. 来看个栗子: function loadReady(callback){ var readyState = document.readyState; if(readyState ==='complete'||readyState==='interactive'){ typeof callback === 'function' && callback(); }else{ window.addEventListener('DOMConte

同步调用与异步调用

提交任务的两种方式:同步调用与异步调用 同步调用 # 同步调用:提交任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码.导致程序是串行执行 import time import random from concurrent.futures import ThreadPoolExecutor def work(name): print("%s is working" % name) time.sleep(random.randint(7, 13)) res = random.r

python37 1.GIL--全局解释器锁 2.GIL带来的问题 3.为什么需要GIL 4.GIL的加锁解锁时机 5.关于GIL的性能的讨论 6.线程常用方法 7.GIL锁与自定义锁的区别 8.进程池与线程池 9.同步异步 10.异步调用

复习1.JoinableQueue--可以被join的队列2.多线程3线程的使用方法与进程一模一样3.1守护线程3.2线程安全问题3.3解决方案3.3.1互斥锁mutex3.3.2递归锁Rlock3.3.3信号量semaphore3.3.4死锁问题 详解:1.JoinableQueue--可以被join的队列 1.1join是等待任务结束 队列怎么叫结束 调用task_done一次则表示有一个数据被处理完成了,当task_done次数等于put的次数就意味着任务处理完成了 1.2这就是join的