4

これは私を完全に混乱させました。ビデオがまだ存在するかどうかを確認するために、一連の Youtube ID を実行しようとしています。

配列にすべての ID があり、gdata API をチェックして、XML 結果または Video not found 404 メッセージが表示されるかどうかを確認したいと考えています。

SOで各IDをチェックしてテーブルに行を追加する関数を見つけました。

var ytarray = ARRAY OF YOUTUBE IDs
var yttitles = ARRAY OF MATCHING TITLES FOR THE VIDS
var urlExists = function(url, callback){
$.ajax({
            type: 'HEAD',
            url: url,
            success: function() {
                callback(true);
            },
            error: function() {
                callback(false);
            }            
        });

    }
    var length = ytarray.length,
    for (var i = 0; i < length; i++) {
    urlExists('http://gdata.youtube.com/feeds/api/videos/'ytarray[i], function(success) {
        if (success) {
              $('#rows').append('<tr><td>'+yttitles[i]+'</td><td>'+ytarray[i]+'</td><td style="color: green">Found</td></tr>');
        } else {
              $('#rows').append('<tr><td>'+yttitles[i]+'</td><td>'+ytarray[i]+'</td><td style="color: red">Not Found</td></tr>');
        }
    });
    };
});
});

テーブルはいっぱいになりますが、すべての行には、最後のビデオの情報が含まれており、ループを通過するときに、各行には含まれていません。

アラートでテストすると、すべての for ループが完了するまでテーブルが入力されないようです。

これは、AJAX の非同期性を正しく処理していないことに関係しているのでしょうか。

4

3 に答える 3

2

同期的に URL 検証を実行する方法に戸惑いました。その後、たまたま YQL に出くわし、しばらく遊んで、次のように構成しました。

  function isValidURL(url) {
    var encodedURL = encodeURIComponent(url);
    var isValid = false;

    $.ajax({
      url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22" + encodedURL + "%22&format=json",
      type: "get",
      async: false,
      dataType: "json",
      success: function(data) {
        isValid = data.query.results != null;
      },
      error: function(){
        isValid = false;
      }
    });

    return isValid;
  }

使い方は簡単です:

var isValid = isValidURL("http://www.wix.com");
alert(isValid ? "Valid URL!!!" : "Damn...");

これが、同期的に URL を検証しようとした人に役立つことを願っています。

于 2014-05-07T20:46:22.563 に答える