使用Jquery Ajax在一个中调用2个Ajax调用

时间:2014-02-17 11:41:15

标签: java jquery ajax

我在将选定的值发布到数据库时遇到了一个问题,其中包含不匹配的值。这是ajax调用映射到相应Java函数的场景。问题是,当用户第一次登录时,我没有在数据库中获得正确的选定值。请提供解决方案......

这是我的Jquery Ajax

if(selectedproductIds != '')
        {               
         $.ajax({
                url : "selectedProducts",
                data : "selectedproducts="+selectedproductIds,  
                 type : "POST",
                success : function(data) {
                }
            });
            $.ajax({
                url : "<c:out value= "${saveDemoURL}"/>",
                data : request,
                type : "POST",
                success : function(data) {
                    showNotification({
                        message : "",
                        type : "success",
                        autoClose : true,
                        duration : 5
                    });
                    resetForm();
                    alert("Demo Request Saved Successfully");
                }
            });

第一个ajax调用映射到此java函数

@RequestMapping(value = "/selectedProducts")
public @ResponseBody
String getSelectedProducts(
        @RequestParam(value = "selectedproducts") String[] selectedproducts,
        Map<Object, Object> map) {
    List<Product> selectedProd = new ArrayList<Product>();
    for (String prod : selectedproducts) {
        Product product = new Product();
        product.setId(Integer.parseInt(prod));
        selectedProd.add(product);
    }
    if (!Util.isEmpty(selectedProd)) {
        map.put("selectedproducts", selectedProd);
    }
    for (Product product: selectedProd) {
        LOGGER.info("Demo ID:"+ " List of selected products:"+product.getId());
    }
    selectedProdList = selectedProd;
    return "success";
}

第二个Ajax调用映射到此java函数

 @RequestMapping(value = "/saveDemo")
public @ResponseBody
Map<Object, Object> saveDemo(@ModelAttribute("demoBean") DemoBean demoBean,
        Model model, Map<Object, Object> map) {
    Map<Object, Object> output = null;
    Demo demo = new Demo();
    try{
        ......
                }
            catch{.....}

    return output;
}

2 个答案:

答案 0 :(得分:0)

将您的代码更改为以下格式:$.ajax().ajax;

if(selectedproductIds != '')
        {               
         $.ajax({
                url : "selectedProducts",
                data : "selectedproducts="+selectedproductIds,  
                async: false,
                type : "POST",
                success : function(data) {
                }
            }).ajax({
                url : "<c:out value= "${saveDemoURL}"/>",
                data : request,
                async: false,
                type : "POST",
                success : function(data) {
                    showNotification({
                        message : "",
                        type : "success",
                        autoClose : true,
                        duration : 5
                    });
                    resetForm();
                    alert("Demo Request Saved Successfully");
                }
            });

答案 1 :(得分:0)

我不是百分之百肯定我明白你的两个函数正在做什么,但如果我是对的并且你正在尝试执行通常包含在事务中的东西,那么你不想从前端根本就是。交易的典型例子是从一个人的账户中取钱并将其放入另一个账户。如果由于电源故障,笔记本电脑重启,网络问题等原因导致中间过程中断,则整个过程需要恢复原状,否则钱只能从一个帐户中消失,永远不会去任何地方。

我想推荐你这个问题:jQuery deferred chaining problems

这有点不同,因为作者已经发现承诺可能是让事情共同发生的关键。但请注意我回答了两次。第二次是专门解释交易永远不应该从前端协调。如果您有两个必须始终一起完成的数据库操作,那么您必须只有一个API调用,它接收两个调用所需的所有数据,并在后端一起执行。从技术上讲,即便如此,你应该在后端使用类似数据库事务的东西来包装它们,这样一个电源故障就不会让你完成一半的操作。但是,如果您尝试在浏览器和服务器之间通过网络执行故障,则多步骤进程中间的故障会增加1000%。将该逻辑放入它所属的服务器中。