Ajax同步真的是同步的么?No,有代码有真相

产品哥 发布于 2013/11/28 23:07
阅读 493
收藏 0
<asp:Content ID="ContentJs" ContentPlaceHolderID="Js" runat="server">
    <script src="../style/javascript/KO/knockout-3.0.0.js"></script>
    <script src="../style/javascript/KO/knockout.mapping-latest.js"></script>
    <script type="text/javascript">
        $().ready(function () {
            Get();
        });
        $("#btHelpSearch").click(function () { Get() });
        function Get() {
            key = "{'Key':'" + encodeURI($('#tbHelpKey').val().trim()) + "'}";
            viewModel = {
                data: ko.observable(null)
            };
            $.ajax({
                type: 'POST',
                url: '/p/help.aspx/Get',
                contentType: "application/json; charset=utf-8",
                data: key,
                cache: false,
                async: false, //同步加载
                success: function (result) {
                    viewModel.data = result.d;
                    alert(viewModel.data); //重点位置
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert(errorThrown);
                }
            })
        }
        function ids(id, isJq) {
            alert("1");
            if (isJq) {
                return id == null ? "" : "#id_" + id;
            } else {
                return id == null ? "" : "id_" + id;
            }
        }
        alert("1111"); //重点位置
        ko.mapping.fromJS(viewModel);
        ko.applyBindings(viewModel);
       
    </script>

结果为

1
对话框: 1111
2
对话框: 返回结果 JSON格式

* ko.xx 这是KO.js 代码。

求助: 怎么才能等结果妇返回后,在执行到 对话框 1111。

也就是真正意义上的同步加载。

加载中
0
狂飙的小蜗牛
狂飙的小蜗牛

把以上代码放到页面底部就可以了,

要是在头部解析到alert(111)时DOM可能还没有准备好

$().ready(function () {
    
Get();

});
中的Get()会晚于alert执行
0
崔钢
崔钢
直接用原生js写,似乎就是同步的。就是直接使用httprequest对象。
WAI
WAI
当然前提是要设置同步提交。
WAI
WAI
不是似乎,是一定。
0
迷路的游侠
迷路的游侠

既然写了async:false,当然已经同步了。

只是楼主你的代码顺序有问题,必然先alert("1111").因为你的Get()方法写在$().ready()里,所以要等网页加载完了才调用,而alert("1111")是顺序执行,所以alert(“1111”)会先执行

0
xue777hua
xue777hua
你吧alert('1111')写到success方法的 alert(viewModel.data); 后面
0
自由PHP
自由PHP
你可能误解了同步请求,同步请求指$.ajax平级的所有jquery代码必须等$.ajax执行有返回之后才继续执行。你这里$.ajax是函数操作,alert属于加载中,jquery属于加载后执行,Get属于jquery执行,所以肯定是这个顺序
0
canghailan
canghailan
ready中的代码的执行本来就应该晚于ready外面代码,你直接在alert之前调用Get试试?
0
Tuesday
Tuesday
楼主搞错概念了.
同步的意思是一起执行, 但不能表示ajax就会快一些. 也有可能下面的代码先执行.
0
lxbzmy
lxbzmy
自己没有搞懂还来问。
lkfoff
lkfoff
没搞懂就是要来问才能知道哪里没搞懂啊
0
JacarriChan
JacarriChan
ajax是异步的, LZ没搞懂
返回顶部
顶部