2016-08-08 6 views
1

Ajaxリクエスト(ローカルのJSONに1番目、オンラインリソースに2番目)の前に実行していた機能に問題があります。Ajaxを使用したJavaScript/jQueryコールバック

この例では、アプリケーションに必要なすべての情報が得られ、divに値を設定した後、countTheMoviesを最後に実行します。代わりに、それはすぐに実行されています。

ifの条件を使って遅延させようとしましたが、喜んでいませんでした。私もコールバックを試してみましたが、間違っているはずです(私はコールバックが答えだと仮定しています)。私はタイムディレイを知っていますが、実際のプロジェクトでは私は250以上の映画をソーシングしているので(タイムド・ディレイは不正に見えるので)、私はここで尋ねると思いました。

この問題を解決するにはJavaScriptまたはjQueryコードをお勧めしますか?

$(function(){ 
    getMovieList(); 
}); 

function getMovieList() { 
    $.ajax({ 
    url: "movielist.json", 
    type: "GET", 
    dataType: "JSON", 
    success: function(data) { 
     for (var i = 0; i < data.length; i++) { 
     var title = data[i].title.toLowerCase().split(" ").join("+"); 
     var year = data[i].year; 
     i === data.length - 1 
      ? getMovieInfo(title, year, true) 
      : getMovieInfo(title, year, false); 
     } 
    } 
    }); 
} 

function getMovieInfo(title, year, isLast) { 
    $.ajax({ 
    url: "https://www.omdbapi.com/?t=" + title + "&y=" + year + "&plot=short&r=json", 
    type: "GET", 
    crossDomain: true, 
    dataType: "JSON", 
    success: function(val) { 
     if (!val.Error) { 
     movie = title.replace(/[^a-z0-9\s]/gi, ''); 
     $("#app").append(
      // appending info to divs 
     ); 
     } 
    } 
    }); 
    if (isLast) countTheMovies(); 
}; 

function countTheMovies() { 
    $("#app").append("There are " + $(".movie").length + " movies."); 
} 

私の欠点のplunker:あなたはそれが成功した場合に実行したい場合はhttps://plnkr.co/edit/0mhAUtEsaOUWhkZMJqma?p=preview

+0

が重複する可能性を試してみてください(http://stackoverflow.com/questions/14220321/how-do-私の返信 - 非 - 非同期呼び出しからの返信) –

+2

3者は無意味です、このinsateadを使用してください.. 'getMovieInfo(タイトル、年、(i === data.length - 1))' –

+0

ありがとうショートカット@Pamblam – dedaumiersmith

答えて

1

ちょうどgetMovieInfoでAJAXリクエストのsuccessコールバックの内側にあなたのcountTheMovies()ロジックを置きます。

+0

あなたはコードを読んでいましたか? –

+0

@Pamblamそうではありません。中括弧をよく見てください。 –

+0

いいえ、それはありませんか? @Pamblamというコードを読んでください。 – Jacob

2

あなたはほとんどそれを持っています!

成功コールバックgetMovieListに同じ方法でgetMovieInfoを呼び出すと、の成功コールバックでcountTheMoviesを呼び出す必要があります。

+0

入手しました。説明をありがとう! – dedaumiersmith

2

上記のJacob氏のように、countTheMoviesコールをAJAXリクエスト内に移動します。

$(function(){ 
 
    getMovieList(); 
 
}); 
 

 
function getMovieList() { 
 
    $.ajax({ 
 
    url: "movielist.json", 
 
    type: "GET", 
 
    dataType: "JSON", 
 
    success: function(data) { 
 
     for (var i = 0; i < data.length; i++) { 
 
     var title = data[i].title.toLowerCase().split(" ").join("+"); 
 
     var year = data[i].year; 
 
     i === data.length - 1 
 
      ? getMovieInfo(title, year, true) 
 
      : getMovieInfo(title, year, false); 
 
     } 
 
    } 
 
    }); 
 
} 
 

 
function getMovieInfo(title, year, isLast) { 
 
    $.ajax({ 
 
    url: "https://www.omdbapi.com/?t=" + title + "&y=" + year + "&plot=short&r=json", 
 
    type: "GET", 
 
    crossDomain: true, 
 
    dataType: "JSON", 
 
    success: function(val) { 
 
     if (!val.Error) { 
 
     movie = title.replace(/[^a-z0-9\s]/gi, ''); 
 
     $("#app").append(
 
      // appending info to divs 
 
     ); 
 
     if (isLast) countTheMovies(); 
 
     } 
 
    } 
 
    }); 
 
}; 
 

 
function countTheMovies() { 
 
    $("#app").append("There are " + $(".movie").length + " movies."); 
 
}

+1

デモをありがとう! – dedaumiersmith

1

あなたのAjax呼び出しのsuccessフィールド内からあなたのcountTheMovies()関数を呼び出すことができます。これにより、意図したときに関数呼び出しが行われます。

0

[私は非同期呼び出しからの応答を返すにはどうしますか?]のこの

$(function(){ 
     getMovieList(); 
    }); 

    function getMovieList() { 
    $.when($.ajax({ 
     url: "movielist.json", 
     type: "GET", 
     dataType: "JSON", 
     success: function(data) { 
      for (var i = 0; i < data.length; i++) { 
      var title = data[i].title.toLowerCase().split(" ").join("+"); 
      var year = data[i].year; 
      i === data.length - 1 
       ? getMovieInfo(title, year, true) 
       : getMovieInfo(title, year, false); 
      } 
     } 
     })).then(function(data, textStatus, jqXHR) { 
     countTheMovies(); 
    }); 
    } 

     function getMovieInfo(title, year, isLast) { 
     $.ajax({ 
     url: "https://www.omdbapi.com/?t=" + title + "&y=" + year + "&plot=short&r=json", 
     type: "GET", 
     crossDomain: true, 
     dataType: "JSON", 
     success: function(val) { 
      if (!val.Error) { 
      movie = title.replace(/[^a-z0-9\s]/gi, ''); 
      $("#app").append(
       // appending info to divs 
      ); 
      } 
     } 
     }); 
    }; 
    function countTheMovies() { 
     $("#app").append("There are " + $(".movie").length + " movies."); 
    } 
+0

こんにちは@urvashi、アドバイスありがとう、新しいコードを紹介してくれてありがとう!私は現時点でそれをテストすることはできませんが、単純に私の電話を移動するのではなく、「いつ」と「その時」を使うことをお勧めしますか? – dedaumiersmith

+0

そして、wenは約束の一部です。つまり、Ajaxリクエストの成功/エラー実行後にコードが実行されることを約束します。:) – urvashi

+0

さて、私は試してみましょう。再度、感謝します! – dedaumiersmith

関連する問題