2017-07-05 6 views
0

私はこれらの2つのコード間のいずれかの概念的な違いがあるかどうかを知りたい:

コード1:

$(function(){ 
    var url = "url"; 
    $.getJSON(url, function(data){ 
    console.log(data); 
    }) 
}); 

はコード2:$ .getJson(状況で

$(function(){ 
    var url = "url"; 
    $.getJSON(url).done(function(data){ 
    console.log(data); 
    }) 
}); 

).done()メソッドは最も関連性がありますか?

+2

、彼らがしているので:https://api.jquery.com/deferred.done/あなたが約束を必要としない場合は、簡単なバージョンを使用 – mplungjan

+0

@mplungjanは、「完了」ですハンドラはインラインで追加されたものではなく、延期された「約束」に単に効果的に追加されていますか? (どちらの場合も遅延が返されます)。つまり、実用的な違いは何ですか? – user2864740

+0

@ user2864740ほとんど実用的な違いはありません。コールバック引数は、約束事がjQueryに追加される前のものと単純に後方互換性があります。 – Barmar

答えて

1

最初のパラメータは、2番目のパラメータとしてコールバック関数を使用します。これにより、関数が完了した後にコードを実行することができます。注意してください。別の機能です。

The Secondも約束としてコールバック関数を使用していますが、フードの下では異なる動作をしています。

// version one 
 
setTimeout(function() { 
 
    doStuff1(); 
 
    doStuff2(); 
 
}, 1000) 
 

 

 
// version one - callback 
 
function doStuff1() { 
 
    doSomething1("value", function(responce) { 
 
    console.log(responce); 
 
    }); 
 
}; 
 

 
function doSomething1(v, cb) { 
 
    if (typeof v === "string") { 
 
    cb(true); 
 
    } else { 
 
    cb(false); 
 
    } 
 
    return false; 
 
} 
 

 
// note the function will always return false but the callback gets the value you want 
 

 

 

 
// version 2, class with promise callback 
 
// look at the class function and see how it works slightly differently 
 
function doStuff2() { 
 
    var $ = new doSomething2(); 
 
    $.Something("value").done(function(resp) { 
 
    console.log(resp) 
 
    }); 
 
}; 
 

 
class doSomething2 { 
 
    constructor() { 
 
    this.v = false; 
 
    } 
 

 
    Something(val) { 
 
    if (typeof val === "string") { 
 
     this.v = true; 
 
    } else { 
 
     this.v = false; 
 
    } 
 
    return this; 
 
    } 
 
    done(cb) { 
 
    return cb(this.v); 
 
    } 
 
}

+0

あなたは、もう一方の代わりに1つを使用しなければならない状況の例を挙げることができますか? –

+0

バージョン2についての素晴らしい点は、それを変数で使用できることです。 '$ .Something(" string ")'を変数に設定できます。 'let task1 = $ .Something(" string ");'それでは、アプリケーションの中で何かをやり、準備ができたら 'task1.done(fn);'を呼ぶことができます。 – Christian4423

+1

私は参照してください。あなたの迅速な対応に感謝します。 –

関連する問題