2015-04-22 75 views
0

我目前正在使用AJAX的功能,但在这种情况下,它使用多个可选嵌套ajax请求。在ajax请求成功后,我似乎无法找出执行重定向的最佳方法。所以想法是运行主要的ajax请求,并在成功函数中调用其他ajax函数。请记住,嵌套的ajax请求是可选的。所有嵌套AJAX请求成功后重定向

 $.ajax 
      ({ 
       type: "POST", 
       contentType: "application/json; charset=utf-8", 
       data: "{'articleName':'" + webName + "', 'title':'" + titleContent + "', 'body':'" + content + "', 'categoryID':'" + $('.js-category-select').val() + "'}", 
       dataType: "json", 
       url: "/internal-service/service.asmx/EditBlogPost", 
           success: (function (data) 
           { 
            var returnVal = data.d; 

            //Is there extensions 
            if ($("[data-blog-type-id]").length > 0) 
            { 
             var extensionAry = []; 

             $("[data-blog-type-id]").each(function() 
             { 
              if ($(this).val() != "") 
              { 
               extensionAry.push($(this).attr("data-f-name") + "|" + $(this).val()); 
              } 
             }); 

             //Must be bookReview field extensions 
             //send array (if has value) 
             if (extensionAry.length > 0) 
             { 
              $.ajax 
               ({ 
                type: "POST", 
                contentType: "application/json; charset=utf-8", 
                data: JSON.stringify({ articleWebname: webName, extensionAry: extensionAry }), 
                dataType: "json", 
                url: "/internal-service/service.asmx/EditBlogExtensions", 
                success: (function (data) 
                { 
                 alert(data.d); 
                }), 
                error: (function() 
                { 
                 //error 
                 alert("ERROR!"); 
                }) 
               }); 
             } 

            } 

            //Has Rating extension 
            if ($(".js-rating").length > 0) 
            { 
             var ratingVal = $(".js-rating").val(); 
             $.ajax 
              ({ 
               type: "POST", 
               contentType: "application/json; charset=utf-8", 
               data: JSON.stringify({ articleWebname: webName, rating: ratingVal }), 
               dataType: "json", 
               url: "/internal-service/service.asmx/EditBlogRating", 
               success: (function (data) 
               { 
                alert(data.d); 
               }), 
               error: (function() { 
                //error 
                alert("ERROR!"); 
               }) 
              }); 
            } 

            if (returnVal != "Error updating blog post") 
            { 
             //Return the path of the article just in case the title has been changed. page uses the title to locate the article on the server 
             alert(returnVal + " Good job!"); 
            } 
            else 
            { 
             alert(returnVal); 
            } 
           }), 
           error: (function() { 
            //error 
            alert("ERROR!"); 
           }) 
          }); 

在后端(C#),这是一个可插拔的体系,其中,因为我可以创建一个应用程序,然后我可以安装一个博客又具有不同的博客类型的扩展名。此外,博客系统可以有额外的插件I.E评级插件。

AJAX似乎令人担忧,可能会遇到可伸缩性问题。任何想法不胜感激。

所以问题是,如果可选的嵌套AJAX请求已被调用,我该如何等待它们完成,然后重定向(将重定向到同一页)?

+1

简化使用jQuery承诺的代码。 将每个负载的代码分解成不同的函数,每个函数都返回它们的Ajax承诺。 然后,您可以使用'then'链接调用,或者使用'$ .when'并行运行它们。要传递复杂的结果,可以使用'$ .Deferred()'来创建一个可以用你自己的附加数据解决的特定承诺。 –

+0

同意。这种深层嵌套是不吸引人的,难以维护。链接承诺在两方面都更好。 – Utkanos

回答

0

简化使用jQuery承诺的代码。

将每个负载的代码分解为不同的函数,每个函数都返回它们的Ajax承诺。

例如

function PostBlah() { 
     return $.ajax({ 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      data: "{'articleName':'" + webName + "', 'title':'" + titleContent + "', 'body':'" + content + "', 'categoryID':'" + $('.js-category-select').val() + "'}", 
      dataType: "json", 
      url: "/internal-service/service.asmx/EditBlogPost" 
     }); 
    } 

然后,您可以链thendone来电或并联$.when运行它们。

 postBlah().then(function(dataFromPostBlah){ 
     step2(dataFromPostBlah).then(function(dataFromStep2){ 
      // etc 
     }); 
    }); 

这将使顶层代码更简单。查看jQuery承诺了解更多细节。

要传递复杂的结果,请使用$.Deferred()创建一个可以用您自己的附加数据解决的特定承诺。

例如

function DoMore(parameter){ 
    var def = $.Deferred(); 
    // Do some stuff asynchronously 
     // When you get a result back later - resolve the promise 
     def.resolve(myComplicatedData); 
    // return a promise to return some complicated data later 
    return def.promise(); 
} 

这里是一个通用的jsfiddle承诺测试平台我放在一起展示的基本承诺逻辑(让你选择扮演):

的jsfiddle:http://jsfiddle.net/TrueBlueAussie/nexpe8pt/2/

+0

梦幻般的答案!但我有点努力去理解语法。你能否详细说明中间层代码片段?因此,如果我有三个函数:EditBlogPost(),EditBlogExtensions()和EditBlogRating(),那么它将如何写入您的代码片段?我也可以检查第一个通过,然后运行其余的?第一个要求是至关重要的。我从后端返回“成功”消息。抱歉努力去理解语法。提前致谢! –

+0

我会用模型更新明天(时区)。承诺提供完成和失败链接。非常灵活。 –

+0

非常感谢!祝你好运! jQuery API文档没有填补知识空白。 –