2012-02-02 31 views
5

Tôi khá mới với jQuery, và tôi đang cố gắng gọi hai hàm trên ajax thành công (vì tài liệu nói là 1,5 thành công gọi lại có thể lấy một mảng chức năng) .jQuery - vượt qua mảng chức năng để gọi lại thành công ajax

Nếu tôi làm điều này, tất cả mọi thứ hoạt động tốt:

$.ajax({ 
    url : sJSONFilePath, 
    dataType : 'json', 
    success : foo(data) 
}); 

gì tôi cần phải làm gì để vượt qua trong một loạt các chức năng? Nếu tôi cố gắng sau, tôi nhận được một "lỗi chưa gặp: Không thể đọc thuộc 'chiều dài' không xác định" lỗi trong giao diện điều khiển:

$.ajax({ 
    url : sJSONFilePath, 
    dataType : 'json', 
    success : [foo(data), bar(data)] 
}); 

tôi đã không thể tìm thấy bất kỳ ví dụ về tính năng này đang được sử dụng. Cảm ơn trước, và xin lỗi nếu điều này là câm.

$.ajax({ 
    url : sJSONFilePath, 
    dataType : 'json', 
    success : function(data) { 
     foo(data); 
     bar(data); 
    } 
}); 

hay này::

+2

Trừ khi 'foo' trả về một chức năng, sau đó này 'thành công: foo (dữ liệu)' doesn' t làm việc cũng như bạn có thể nghĩ. Bạn đang gọi 'foo' ngay lập tức thay vì chuyển nó thành một cuộc gọi lại. –

Trả lời

13

Không cần cho một mảng, bạn có thể sử dụng cú pháp thu nhập hoãn lại cũng được giới thiệu trong jQuery 1.5 :

Điều này thường sạch hơn và mở rộng hơn nhiều so với chức năng gọi lại làm tham số cho $.ajax và người thân.

Từ $.ajax() documentation:

The jqXHR objects returned by $.ajax() as of jQuery 1.5 implement the Promise interface, giving them all the properties, methods, and behavior of a Promise (see Deferred object for more information). For convenience and consistency with the callback names used by $.ajax() , jqXHR also provides .error() , .success() , and .complete() methods. These methods take a function argument that is called when the $.ajax() request terminates, and the function receives the same arguments as the correspondingly-named$.ajax()callback. This allows you to assign multiple callbacks on a single request, and even to assign callbacks after the request may have completed. (If the request is already complete, the callback is fired immediately.)

[nhưng xem đoạn sau, nơi mà nó giải thích cách .success, .error.complete hiện đang bị phản đối và thay thế bằng .done, .fail.always]

+0

Công trình này hoạt động. Truyền $ .done (dữ liệu, textStatus, jqXHR) thành foo và thanh giống như thành công? Tôi không biết nhiều về Deferred – MJS

+0

@MJS có, nó sẽ - Tôi sẽ thêm một số văn bản. – Alnitak

+0

Chỉ cần một lưu ý cho bất cứ ai xảy ra khi điều này: Các tài liệu hướng dẫn xuất hiện để cho thấy rằng các cuộc gọi lại được thực hiện trong nối tiếp. –

5

Những gì bạn làm điều này là

$.ajax({ 
    url : sJSONFilePath, 
    dataType : 'json', 
    success : [foo, bar] 
}); 

Lưu ý rằng trong một giây, tôi không gọifoobar, tôi liệt kê các tham chiếu hàm trong một mảng (kể từ khi bạn nói, như là 1,5 tùy chọn gọi lại ajax của jQuery cho phép điều đó).


Bạn đã nói rằng đây hoạt động tốt:

$.ajax({ 
    url : sJSONFilePath, 
    dataType : 'json', 
    success : foo(data) 
}); 

nhưng nó không. Điều đó có nghĩa là ngay lập tức gọi chức năng foo và sau đó gán giá trị trả lại của hàm đó cho thuộc tính success của các tùy chọn bạn đang chuyển đến ajax. Trừ khi bạn đang sử dụng foo để tạo và trả về một hàm để sử dụng làm gọi lại, đó không phải là những gì bạn muốn làm.

Điều quan trọng là phải hiểu sự khác biệt giữa gọi một chức năng và sử dụng tham chiếu đến nó. Nếu bạn có dấu ngoặc đơn sau tên hàm (có hoặc không có đối số trong chúng), bạn đang gọi. Nếu bạn chỉ có tên, bạn đang đề cập đến nó. Ví dụ:

var f = foo(); // CALLs `foo` and assigns return value to `f` 
var f = foo; // Assigns a reference to `foo` to `f` 
+0

+1 Rất kỹ lưỡng. –

+0

Điều này thật hoàn hảo. Tôi nghĩ rằng JS của tôi đã được lưu trữ, và đó là lý do tại sao nó làm việc với mã borked của tôi. Tôi sẽ đánh dấu câu trả lời này sau 15 phút. Cảm ơn bạn đã trả lời kỹ lưỡng! – MJS

+0

@amnotiam trừ hoàn toàn bỏ lỡ việc sử dụng cú pháp đối tượng trì hoãn, hiện là cách ưu tiên để thực hiện lời gọi AJAX ... – Alnitak

0

Tại sao bạn không gọi một chức năng mà các cuộc gọi hai người kia:

$.ajax({ 
    url : sJSONFilePath, 
    dataType : 'json', 
    success : foo_bar(data) 
}); 

function foo_bar(data) 
{ 
    foo(data); 
    bar(data); 
{ 
1

khi viết

success : [foo(data), bar(data)] 

bạn một tái trên thực tế đánh giá các chức năng foo và bar (có lẽ với một đối số null)

bạn cần phải viết

success : [foo, bar] 
Các vấn đề liên quan