2013-03-09 23 views
7

Tôi đang cố gắng sử dụng jsonp với jQuery nhưng tôi nhận được các hành vi không nhất quán. Đôi khi kịch bản hoạt động, đôi khi nó không; Tôi không hiểu tại sao.lỗi jsonp không phù hợp: đối tượng không phải là hàm

Đây là lỗi có thể được hiển thị bằng Chrome:

Uncaught TypeError: Property 'jQuery18208278296771459281_1362854738133' of object [object Object] is not a function 

Trong ví dụ sau, tôi chỉ cố gắng để kiểm tra xem các ứng dụng trực tuyến hay không. Nhưng hành vi không phù hợp này có thể xảy ra cho các cuộc gọi ajax tương tự khác:

 $.ajaxSetup({ 
     error: function (req, status, ex) {}, 
     success: function (data, status, req) {}, 
     timeout: 2000, 
     crossDomain: true, 
     contentType: "application/json", 
     dataType:"jsonp", 
     url: "http://myUrl.com/ping.php?preventCache="+new Date() 
    }); 
    return $.ajax(); 

Các máy chủ tập tin bên PHP là khá đơn giản quá:

<?php 
header("Content-Type: application/javascript; charset=UTF-8"); 
echo $_GET['callback']; 
?> ({ "status": "online" }) 

Trả lời

5

câu hỏi của bạn không rõ ràng lắm, tôi đã gặp lỗi tương tự khi cố sử dụng cùng tên chức năng gọi lại hai lần. Trong mọi trường hợp đây là cách jsonp nên được gọi là trong jquery:

 var mycallback = 'c'+Math.floor((Math.random()*100000000)+1); 
     $.ajax({ 
        type: 'GET', 
        url: URL, 
        async: true, 
        jsonpCallback: mycallback, 
        contentType: "application/json", 
        dataType: 'jsonp' 

     }).done(function(json){ 
      console.log(json); 
        callback(json); 
     }).fail(function(f){ 
      console.log("f"); 
        console.log(f.status); 
     }).always(function(){ 
        // console.log('complete'); 
     }); 
2

Kiểm tra nếu kịch bản của bạn đang thực hiện một yêu cầu AJAX giống hệt nhau nhiều hơn một lần trong kế vị.

Tôi có trình xử lý sự kiện bị lỗi kích hoạt hai yêu cầu cùng một lúc và điều này gây ra cùng một vấn đề.

(Tôi giả sử bạn gọi $ .ajaxSetup một lần): Có vẻ như bạn định áp dụng bộ đệm ẩn cho cuộc gọi ping của mình, nhưng thực hiện trong $ .ajaxSetup có thể có hiệu ứng ngược lại vì URL sẽ được sửa cho tất cả các yêu cầu tiếp theo.

15

Bạn sẽ nhận được hành vi này khi JSONP bạn gọi lần ra (đó là hai giây, theo dòng timeout: 2000 của bạn), nhưng dữ liệu đến sau thời gian chờ đã xảy ra.

JSONP không sử dụng XmlHTTPRequest bình thường. Để làm JSONP, jQuery chèn một thẻ script vào tài liệu của bạn và tạo ra một hàm tạm thời để xử lý việc nạp thẻ script (tên hàm là chuỗi ngẫu nhiên dài trong thông báo lỗi).

Khi thời gian chờ của bạn diễn ra và tập lệnh chưa tải xong, jQuery sẽ hủy chức năng tạm thời. Đôi khi sau đó, thẻ script kết thúc tải, và cố gắng gọi hàm đó - nhưng đã quá muộn, hàm đã bị xóa. Do đó lỗi.

Có thể bạn có thể gặp ít lỗi hơn bằng cách kéo dài thời gian chờ, nhưng vấn đề cơ bản là bạn không thể hủy tải thẻ tập lệnh. Nếu nó không bị lỗi, thì luôn có khả năng mất nhiều thời gian hơn thời gian chờ của bạn. Theo như tôi biết không có giải pháp gọn gàng cho việc này. Bạn có thể yêu cầu jQuery sử dụng một hàm được đặt tên rõ ràng làm hàm gọi lại JSONP thay vì tự tạo, nhưng sau đó bạn sẽ cần phải theo dõi xem liệu điều đó có tự hết thời gian hay không. Bạn có thể sử dụng CORS, đó là một thứ khác.

Có lẽ đặt cược tốt nhất của bạn là sống với nó.

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