1

我有以下代码,出于某种奇怪的原因,事件发生的顺序对我来说没有意义。无论如何,我可以使它按顺序排列吗?

var vm_good = false;
console.log("Before", vm_good);
    $.post("./ajax/call_price", {id: product_id}, function(data){
        $.each(data, function(key, value){
           $(".unit-price span").html(value);
        });
        vm_good = true;
        console.log("Inside", vm_good);
        enableNext();
    }, 'json');
    console.log("After", vm_good);

控制台窗口上的结果是:

>Before false
>After false
>Inside true
>window.vm_good // I called it manually after the page loaded
>>true
4

2 回答 2

2

$.post是 的简写$.ajaxA在 AJAX 中代表异步,因此解释器将执行下一个命令,同时在您的请求完成时$.post运行您的事件处理程序 ( )。function(data)如果您的请求不是异步的,那么您的浏览器将冻结,因为它会等待您的请求完成。

您可以$.when(deffered).then(handler)在请求完成后使用执行代码:

var callPrice = $.post("./ajax/call_price", {id: product_id}, function(data){
    $.each(data, function(key, value){
       $(".unit-price span").html(value);
    });
    vm_good = true;
    console.log("Inside", vm_good);
    enableNext();
}, 'json');

$.when(callPrice).then(function () {
    console.log("After", vm_good);
});
于 2013-04-22T15:23:13.837 回答
2

.post()是一个异步请求。这意味着 JS 不会等待它完成,它只是继续执行下一条指令。

您需要 console.log("After", vm_good);像这样放入您的帖子回调中-

var vm_good = false;
console.log("Before", vm_good);
    $.post("./ajax/call_price", {id: product_id}, function(data){
        $.each(data, function(key, value){
           $(".unit-price span").html(value);
        });
        vm_good = true;
        console.log("Inside", vm_good);
        enableNext();

        console.log("After", vm_good); // you should put this here
    }, 'json');
于 2013-04-22T15:20:28.763 回答