2013-04-06 66 views
22

Tôi muốn một hàm trả về một giá trị từ một yêu cầu ajax. Tôi muốn ngừng thực hiện javascript cho đến khi hàm nhận được giá trị của nó được trả về bởi yêu cầu không đồng bộ ajax. Cái gì như:chức năng trả về một giá trị từ yêu cầu gọi ajax

function myFunction() { 
    var data; 
    $.ajax({ 
     url: 'url', 
     data: 'data to send', 
     success: function (resp) { 
      data = resp; 
     }, 
     error: function() {} 
    }); // ajax asynchronus request 
    return data; // return data from the ajax request 
} 
+2

Điểm A đầu tiên trong AJAX là gì? – Barmar

+0

@Barmar Aaardvark! – Ian

Trả lời

32

Bạn cần phải đăng ký một hàm callback, một cái gì đó như thế này:

+2

Không cần lưu trữ nó trong 'dữ liệu'. Chỉ cần gọi số gọi lại – Ian

+1

@Tôi vẫn tốt hơn phần còn lại của thân nhân :-) –

+1

@JanDvorak Không bao giờ nói là không :) Chỉ cố gắng giúp cải thiện câu trả lời. – Ian

2

Sử dụng async: false cho yêu cầu ajax của bạn kể từ Ajax là không đồng bộ.

Đặt không đồng bộ thành sai nghĩa là tuyên bố bạn đang gọi phải hoàn tất trước khi có thể gọi câu lệnh tiếp theo trong hàm của bạn. Nếu bạn đặt async: true thì câu lệnh đó sẽ bắt đầu thực thi và câu lệnh tiếp theo sẽ được gọi bất kể câu lệnh async đã hoàn thành chưa.

Từ jQuery docs:

By default, all requests are sent asynchronously (i.e. this is set to true by default). If you need synchronous requests, set this option to false

+1

Bạn phải giải thích rõ hơn. Trong khi đó có thể làm việc, OP có lẽ sẽ không hiểu, vì họ không hiểu vấn đề ở bàn tay. – Ian

3
$.ajax({ 
     url: 'url', 
     data: 'data to send', 
     async: false, 
     success: function (resp) { 
      data = resp; 
     }, 
     error: function() {} 
    }); // ajax synchronus request 
4

bạn cần làm asyn = False như:

$.ajax({ 
    async: false, 
    // ... 
    success: function(jsonData) { 
    //Your Logic 
    } 
}); 
+1

Đó là trong trường hợp bạn muốn có một phản ứng đồng bộ, tất nhiên. – Pere

5

Ajax là không đồng bộ, điều đó có nghĩa là cuộc gọi ajax được gửi đi nhưng mã của bạn tiếp tục chạy như hạnh phúc như trước mà không dừng lại. Ajax không dừng/tạm dừng thực thi cho đến khi nhận được phản hồi. Bạn sẽ phải thêm một hàm gọi lại bổ sung hoặc một cái gì đó tương tự.

function myFunction() { 
var data; 
$.ajax({ 
    url: 'url', 
    data: 'data to send', 
    async: false, 
    success: function (resp) { 
     data = resp; 
     callback.call(data); 
    }, 
    error: function() {} 
}); // ajax asynchronus request 
return data; // return data from the ajax request 
    } 
+0

Bạn cần phải thực sự chuyển 'dữ liệu' hoặc' resp' sang hàm gọi lại ... – Ian

+0

yes rgt ... .tahnx @lan .... để chuyển hướng tôi .... :) –

+1

Vâng, bạn có thể muốn 'callback.call (this, data);' vì tham số đầu tiên của 'call' là để thiết lập bối cảnh' this' này trong hàm. – Ian

Các vấn đề liên quan