2011-10-10 31 views
7

Hãy xem this JsFiddle:Làm thế nào để giảm tần suất của các lỗi như vậy trong mã của tôi?

var requests = [ 
    $.ajax("http://search.twitter.com/search.json", { data: { q: 'ashishnjain' }, dataType: 'jsonp' }) 
    .done(function() {console.log("request");}), 

    $.ajax("http://search.twitter.com/search.json", { data: { q: 'ashishnjain' }, dataType: 'jsonp' }) 
    .done(function() {console.log("request");}) 
]; 

$.when(requests).done(console.log("alldone")); 

Sản lượng dự kiến ​​là: request request alldone, nhưng trong thực tế này in alldone request request. Có hai lỗi trong đoạn mã này (còn lại là một bài tập nếu bạn thích loại đó), nhưng cuối cùng tôi nghĩ điều này xảy ra vì JavaScript và jQuery đều rất khoan dung khi đưa ra các đối số không có ý nghĩa gì cả. Trong môi trường này, điều "đúng" có vẻ là "làm một cái gì đó hoặc không có gì, chỉ cần không ném một lỗi!".

Thấy mã này vượt qua JsLint và chỉ mất một vài giờ để gỡ lỗi (mã thực tế dĩ nhiên là một vài đơn đặt hàng phức tạp hơn), tôi tự hỏi tôi có thể làm gì khác giảm lãng phí thời gian vào sự khoan dung không được bảo đảm như vậy. Đây không phải là một ví dụ bị cô lập; nó dường như xảy ra hơn và hơn nữa. Bất kỳ đề xuất?

+0

Các đối số không có ý nghĩa theo bạn. Theo động cơ, tôi chắc chắn họ làm. Lỗi nào bạn mong đợi từ "lỗi" của mình? Một cái gì đó như "đối số không hợp lệ"? – bzlm

+0

@bzlm Tôi rất muốn thảo luận về điều đó, nhưng tôi lo sợ điều này sẽ làm giảm câu hỏi. Tôi không thể thay đổi JavaScript, và tôi không thể thay đổi jQuery (nhiều), vì vậy tôi tự hỏi làm thế nào để tránh những thứ như thế này. –

+1

Tôi cảm thấy đau đớn của bạn. Nó là không thể tin được phổ biến như thế nào dễ bị lỗi kiểu lập trình này là. Một ngày trôi qua mà không cần phải rà soát thông qua mã JS của chính tôi và nhìn vào mọi chi tiết của các cú pháp nhỏ nhất, để tìm lỗi mà trình biên dịch thích hợp sẽ tìm thấy và gắn cờ trong một phần nhỏ của giây. Tôi không biết những người khác thích trải nghiệm bực bội này như thế nào, nhưng tuy nhiên họ làm điều đó, họ không thể làm việc hiệu quả theo cách đó. – Timwi

Trả lời

0

Hình như bạn nhầm

$.when([x,y]) 

cho

$.when(x,y) 

Tôi không nghĩ rằng có một công cụ phân tích ra khỏi đó sẽ giúp bắt nhầm lẫn loại hình vì nó là hoàn toàn có thể chấp nhận để vượt qua một danh sách để khi nào. Nếu bạn muốn có một chức năng hạn chế hơn bạn có thể làm một mình:

function whenForMoreThanOne(list_of_deferreds){ 
    return $.when.apply($, list_of_deferreds); 
} 
3

Đó là thực sự có thể check types trong thời gian chạy trong Javascript, nó chỉ là là nghiêm ngặt không phải là phong cách ưa thích trong Javascript. JS tin tặc muốn treo nó lỏng lẻo.

Các tin tặc khác đối phó với điều này, đúng không? Vì vậy, thay vì đổ lỗi cho ngôn ngữ hoặc jQuery trong thời gian dài của bạn để gỡ lỗi cho vấn đề này, tôi sẽ đề xuất thay vì điều tra các cách khác để giảm nỗ lực gỡ lỗi của bạn.

Dưới đây là một vài gợi ý tôi có thể nghĩ:

  1. Kiểm tra ra những mảnh nhỏ của mã trong tương tác giao diện điều khiển JS đầu tiên trước khi dán nó trong tập tin .js của bạn: đây
    • cho phép bạn nhanh chóng lặp cho đến khi bạn nhận được nó đúng (làm thế nào để bạn sử dụng $ .Khi()?)
    • đảm bảo rằng khi bạn làm được điều đó đúng, bạn hiểu làm thế nào để sử dụng API
  2. Giữ stud ying JS, và tiếp tục viết nhiều hơn về nó. Lỗi thứ hai bạn thực hiện: không gói console.log ("tất cả đã làm") trong một hàm cho thấy rằng khái niệm cơ bản về JS chưa được khóa hoàn toàn - một hacker JS dày dạn sẽ không bao giờ phạm sai lầm đó.
+0

'" một hacker JS dày dạn sẽ không bao giờ phạm sai lầm đó "- bạn chắc chắn thế nào về điều này? Bạn có thể nói điều này chỉ vì chúng tôi không thể nhìn vào màn hình của bạn mọi lúc. Nếu bất cứ ai nhìn thấy bạn mắc lỗi tương tự trong JS, thậm chí một lần, bạn sẽ giống như một kẻ đạo đức giả lớn. – Timwi

+1

Kiểm tra loại sẽ chỉ bảo vệ chống lại các lỗi loại. Lỗi của OP không phải là lỗi loại (và nhiều hơn nữa là vấn đề $. Khi có một API lộn xộn) – hugomg

+2

Sai lầm của OP * là * thực sự là lỗi kiểu (ít nhất, lỗi không bao gồm 'console.log' sẽ được tiết lộ bởi loại kiểm tra). Tôi là một hacker JS dày dặn và tôi đã phạm sai lầm đó khoảng hai tuần một lần. – Malvolio

1

Trong trường hợp lỗi nổi bật hơn của bạn, câu trả lời có thể được nói thành hai từ: static typing. Việc đánh máy tĩnh không giải quyết được mọi vấn đề nhưng nó làm rơi một phần lớn trong công việc liên quan đến việc theo dõi những thất bại tinh tế này.

Nhược điểm của các loại tĩnh là không, như thiếu sót xác nhận quyền sở hữu, bất kỳ điều gì cần làm với lập trình khó khăn hơn hoặc kém hiệu quả hơn hoặc bất cứ điều gì tương tự. Vấn đề lớn nhất là sức mạnh của hệ thống gõ ngôn ngữ có vẻ khác nhau một cách nghịch đảo với sự phổ biến của ngôn ngữ. Các ngôn ngữ được đánh máy rất tốt như Scala và Haskell vẫn ở mức chấp nhận của cửa hàng. Java là phổ biến hơn nhiều, nhưng loại hệ thống của nó là khó sử dụng và bắn đầy đủ các lỗ; một cái gì đó tương tự có thể nói về C#. Hệ thống kiểu của PHP vô cùng phổ biến sẽ tấn công một người quan sát trung lập như một sự phá hoại có chủ tâm. Các ngôn ngữ cũ hơn như FORTAN và C thậm chí không thử.

Tôi không biết tại sao điều này xảy ra, nhưng tôi tin rằng lời giải thích rõ ràng - mọi người không thích gõ mạnh - không chính xác.

Sự cố liên quan là bạn chưa thể biên dịch bất kỳ ngôn ngữ được nhập mạnh nào thành JavaScript. Cách tiếp cận gần nhất có lẽ là GWT.

+0

Tính không thể giải quyết của vấn đề tạm dừng đảm bảo rằng có những chương trình không được xử lý tốt mà không thể kiểm tra tĩnh bởi trình biên dịch vì vậy các kiểu tĩnh về mặt kỹ thuật là một hạn chế: P Nhưng vâng, tôi nghĩ rằng bạn chính xác trong việc xác định Haskell đã làm cho tôi quá cầu kỳ khi nói đến hệ thống kiểu. – hugomg

+0

@missingno: Điều này không liên quan gì đến sự cố tạm dừng. Bạn không cần hệ thống loại hoàn chỉnh Turing để thể hiện bất kỳ chương trình nào. Nếu bạn cần kiểm tra kiểu thư giãn, bạn luôn có thể sử dụng 'đối tượng' kiểu uber. Trên hết, C# thậm chí còn có kiểu 'dynamic' rất giống với những gì bạn muốn. Với điều này, gõ tĩnh là một tính năng bổ sung trên đầu trang của một ngôn ngữ untyped có thể cung cấp, và không mất bất cứ điều gì đi. (Trong thực tế, tôi thấy loại 'năng động 'rất hiếm khi hữu ích.) – Timwi

+0

@Timwi: Tôi đã hy vọng khuôn mặt cười ngớ ngẩn sẽ làm rõ rằng đó là một nhận xét rõ ràng nhất. – hugomg

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