2011-10-10 6 views
7

this JsFiddleを見てみましょう:request request alldoneが、実際にはこれはalldone request requestを出力します。私のコードでこのようなエラーの頻度を減らすには?

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")); 

予想される出力です。

実際にはこのコードに2つのバグがあります(このようなことを楽しむ場合、練習として残しています)。しかし、最終的には、JavaScriptとjQueryがどちらも意味をなさない引数を与えられたときに非常に寛大であるためです。この環境では、「正しい」ことは、「何かをしても何もしないで、ただエラーを投げない」と思われます。

はJsLintに合格し、デバッグに数時間かかるだけです(実際のコードはもちろん数桁の複雑さが増しています)。他に何ができるのでしょうか?そのような不当な寛容さの無駄な時間を減らす。これは孤立した例ではありません。それは何度も何度も繰り返されるようです。助言がありますか?

+0

あなたの意見では、議論は意味をなさない。エンジンによると、彼らは確信しています。あなたの "バグ"にはどんなエラーがありますか? 「無効な議論」のようなもの? – bzlm

+0

@bzlm私はそれについて話したいと思うが、これはトラックから質問を引き出すことを恐れている。 JavaScriptを変更することはできません.jQueryを変更することはできません(多くの場合)。このようなことを避ける方法が不思議です。 –

+1

私はあなたの痛みを感じます。このエラーの起こりやすいプログラミングスタイルがどれほど普及しているかは信じられません。私は自分のJSコードを辿ることなく1日を過ごすことはほとんどなく、適切なコンパイラが見つけ出して何分の1秒の間にフラグを立てるエラーを見つけるために、シンタックスの最も細かい部分を凝視します。私は他の人々がこのイライラした経験をどのように楽しんでいるのか分かりませんが、彼らはそれをやっています。 – Timwi

答えて

0

は、あなたがそれを渡すために完全に受け入れているので、この種の誤りをキャッチするのに役立ちますそこ解析ツールがあり、私は考えていない

$.when([x,y]) 

$.when(x,y) 

のために間違えたように見えますリストをいつにするか。あなたはより限定的な機能を持っているしたい場合は、1を自分で作ることができます:それは

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

は、それが厳密であることがJavaScriptで好みのスタイルではないだけということですが、JavaScriptで実行時にcheck typesに実際に可能です。 JSのハッカーは、それをゆるめるのが好きです。

他のハッカーたちもこれに対処していますよね?だから、あなたの長い時間のために言語やjQueryを非難するのではなく、この問題をデバッグするのではなく、デバッグ作業を減らすための他の方法を調べることをお勧めします。ここで

は、私は考えることができる提案のカップルです:最初に、あなたの.jsファイルでそれを貼り付ける前に、インタラクティブJSコンソールで

  1. テスト実行コードの小片をこの
    • は、あなたがすることができますあなたはそれが権利を取得するまで急速に反復(どのようにあなたが$ .when()を使うのですか?)
    • はあなたが右のそれを取得しないとき、あなたはスタッドをキープ
    • API
  2. の使用方法を理解していることを保証しますJSを書き、それ以上のことを書いてください。 2つ目のエラー:console.log( "all done")を関数にラップしないと、JSに関する基本的な概念がまだ完全にロックされていないことがわかります。熟練したJSハッカーが決して間違いを犯すことはありません。
+0

''味付けしたJSハッカーは決してそのミスをしませんでした。 " - あなたはこれについてどうやっているのですか?あなたは常にあなたの画面を見ることができないので、これは言うことができます。誰もがJSで似たような間違いをするのを見たなら、一度でも大きな偽善者のように見えます。 – Timwi

+1

型検査は型エラーに対してのみ保護します。 OPの間違いは、実際には型エラーではありません(そして、複雑なAPIを持っていると$。の問題) – hugomg

+2

OPの間違い*は実際には型エラーです(少なくとも、 'console.log'をラップしないことについては、タイプチェック)。私は熟練したJSのハッカーで、私は約2週間に一度そのミスを犯します。 – Malvolio

1

あなたのより顕著なエラーの場合、答えは2つの単語:static typingと言うことができます。静的タイピングはすべての問題を解決するわけではありませんが、これらの微妙な失敗を追跡する作業の中で大きな塊を裂きます。

静的型の短所は、ではなく、であり、クレームがありません。プログラミングを難しくするか、それほど強力でないものなどです。最大の問題は、言語のタイピングシステムの強さが言語の人気に反比例して変化するように見えることです。 ScalaやHaskellのような型付きのよい型付けされた言語は依然として受け入れのブティックレベルにあります。 Javaははるかに普及していますが、そのタイプシステムは使いにくく、穴がいっぱいです。 C#についても同様のことが言えます。非常に普及しているPHPの型システムは、中立的なオブザーバーを意図的な妨害行為として攻撃するだろう。 FORTANやCのような古い言語も試していません。

これはなぜわかりませんが、明白な説明 - 人々は強い入力が気に入らない - が間違っていると確信しています。

関連する問題は、強力な型指定の言語をJavaScriptにコンパイルできないということです。最も近いアプローチはおそらくGWTです。

+0

halting-problemのun​​decideabilityは、コンパイラによって静的にチェックすることができないタイプのない型付きプログラムがあることを保証します。したがって、技術的に静的型は制限です:Pしかし、私はあなたがHaskellも私を作ったシステムをタイプするときにはピカピカ。 – hugomg

+0

@missingno:これは停止問題とは関係ありません。プログラムを表現するためにチューリング完全型システムは必要ありません。緩やかな型チェックが必要な場合は、いつでもuber-typeの 'object'を使うことができます。その上に、C#はあなたが望むものと非常に似ている '動的な'型も持っています。これにより、静的型付けは、型指定されていない言語が提供できるものの上に追加された機能であり、何も取り除かない。 (実際には、私は「ダイナミック」タイプが非常に有用であるとは思っていません) – Timwi

+0

@ティムウィー:私は、馬鹿げた笑顔が明らかに上から上の発言であることを明らかにしたと思いました。 – hugomg

関連する問題