0

関数外のコールバックから変数値にアクセスしたい

function test()
{
    var videoData=[];
    searchYTVideos("test1",0,function(vidYT){
       //concat to videoData
       videoData = videoData.concat(vidYT);

    });

    searchVideo("test2",0,function(vidDM){
        //concat to videoData
        videoData = videoData.concat(vidDM);
    });
    console.log(videoData);
}

しかし、私は空白の値を取得します。vidYT と vidDM の値を videoData に連結するにはどうすればよいですか

4

4 に答える 4

0

コードは非同期であるためconsole.log、コールバックが呼び出される前に実行されます。

コールバックをネストしてみることができます:

var videoData=[];
searchYTVideos("test1", 0, function(vidYT) {
    //concat to videoData
    videoData = videoData.concat(vidYT);

    searchVideo("test2", 0, function(vidDM){
        //concat to videoData
        videoData = videoData.concat(vidDM);

        console.log(videoData);
    });
});

または、それらをネストしたくない場合は、フラグ/カウンターと、コールバックが呼び出されたかどうかを確認する 3 番目の関数を使用できます。

var videoData=[];
var numCalled = 0;

searchYTVideos("test1",0,function(vidYT){
   //concat to videoData
   videoData = videoData.concat(vidYT);

   numCalled++;
   logData();

});

searchVideo("test2",0,function(vidDM){
    //concat to videoData
    videoData = videoData.concat(vidDM);
    numCalled++;
    logData();
});

function logData() {
    if(numCalled === 2) {
        console.log(videoData);
    }
}

個人的には入れ子版の方がわかりやすいと思います。

于 2014-02-27T16:55:27.237 に答える
0

promise を使用してこの問題を解決できます。ドキュメントから:

Promise インターフェイスは、作成時に必ずしも知られていない値のプロキシを表します。これにより、ハンドラーを非同期アクションの最終的な成功または失敗に関連付けることができます。これにより、非同期メソッドは同期メソッドのように値を返すことができます。非同期メソッドは、最終値の代わりに、将来のある時点で値を持つという promise を返します。

これを読んで作業開始。関数の場合は jquery を使用します。

$.when(searchYTVideos("test1",0),  searchVideo("test2", 0)).done(function(data){
  // your logic
});

私のコードは単なる例です。約束の方法論は非常に強力で、あなたの場合に役立ちます。スパゲッティ コードを回避するのに役立ちます。

また、例を使った非常に良い説明

于 2014-02-27T16:59:24.587 に答える
0

console.log両方の検索関数が非同期であると仮定すると、ブラウザが にアクセスしたときvideoData、コールバックがまだ実行されていないため、まだ空である可能性があります。

JS の非同期の驚異へようこそ!

非同期では、データを処理することはできないreturnため、コールバックが必要です。

できることは、両方の検索関数に対して 3 番目の関数を呼び出して、両方のコールバックが実行されたかどうかを確認することです。または、1 つの呼び出しを別の呼び出しにネストします。その後、安全にconsole.logあなたのvideoData. これは、コードを通常の同期パターンから切り離すことを意味します。

于 2014-02-27T16:53:59.163 に答える