2016-07-27 20 views
0

私は複数の関数を次々に連鎖させて約束し、それぞれの関数はAJAX呼び出しを行いたい。私はmyfunction2を呼び出す前に実行するためにmyfunction1のコールバックが必要になりますjQuery deferred ajax実行命令

function myfunction1() { 
 
    console.log("myfunction1"); 
 
    return $.ajax({ 
 
    url: "/" 
 
    }).always(function() { 
 
    console.log("myfunction1 done"); 
 
    }); 
 
} 
 

 
function myfunction2() { 
 
    console.log("myfunction2"); 
 
    return $.ajax({ 
 
    url: "/" 
 
    }).always(function() { 
 
    console.log("myfunction2 done"); 
 
    }); 
 
} 
 

 

 
myfunction1() 
 
    .then(myfunction2());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

:このような

何か。 だから私はこの順序が必要になります

myfunction1 
myfunction1 done 
myfunction2 
myfunction2 done 

が、コードサンプルは、この順序で実行します:

括弧が上がらない:

myfunction1 
myfunction2 
myfunction1 done 
myfunction2 done 

すべてのヘルプは

ソリューションをいただければ幸いです必要がありません

myfunction1().then(myfunction2); 

の代わり:

+1

'.then(myfunction2());'はすぐに関数を呼び出し、結果セットを 'then'に渡します。コールバックを '.then(myfunction2)'の代わりに渡したいとします。 – Bergi

+0

うわー、私はほとんどこのコメントを逃した、それは私の問題を解決、巨大な感謝! – inverz

+0

@inverz - このサイトでは、決してあなたの質問にソリューションを編集するつもりはありません。質問は質問のままにすることです。他に誰も答えを掲示せずに解決策を見つけたら、自分で回答を投稿することができます。または、他の人が回答を投稿している場合は、その回答の横にある緑色のチェックマークをチェックすることで回答を受け入れることができます。これはあなたの質問が今答えられたことをコミュニティに示します。 – jfriend00

答えて

0

@bergi

myfunction1().then(myfunction2()); 

おかげで誰もが答えにソリューションを入れていないので、私はこの質問をラップするためにそうします。

このことから、あなたのコードを変更

:これまで

myfunction1().then(myfunction2()); 

を:

myfunction1().then(myfunction2); 

あなたはタイミングが適切であるとき、それはLATER関数を呼び出すことができるように.then()にのみ機能の参照を渡す必要があります。関数名の後ろに括弧を置くと、JSインタプリタに関数を直ちに実行させ、戻り結果を.then()ハンドラとして渡すように指示していました。だから、それが望んでいる順序で実行されていなかったのです。


これはよくある間違いです。関数名の後ろに括弧を置くと、すぐに実行されることに注意してください。ファンクション名自体を渡すと(括弧なし)関数の参照が渡されます。この関数の参照は、渡された関数/メソッドによって後で呼び出すことができます(ここで必要なものです)。