2017-11-01 5 views
0

アプリケーションにロードするメディアファイルデータを取得しようとしています。私は複数のajax呼び出しを順番に行う必要があります。非同期ループの最初の反復でエラーが発生する

問題:「未定義のプロパティ 'map'を読み取ることができません」というエラーが表示されます。私はauto_video_jobs_arrayをどこかのレンダリングメソッドにマッピングしています。

以下のコードは、私がajax非同期呼び出しをどのようにして順番に行い、状態current_auto_video_jobsを設定するかを示しています。最後のajax呼び出しの終わりに、私はstate current_auto_video_jobsの値を表示して、その中にオブジェクトがあることを見ることができます。

(それが簡単に理解することについて、私は私のQUESにも変数と状態の宣言を示しています)

var auto_video_jobs_array = []; 
var auto_video_jobs_urls = []; 



state = { 
     MediaFiles: [], 
     fileURLS: [], 
     current_auto_video_jobs: [[{job_type:"", eta:0}],[{job_type:"", eta:0}],[{job_type:"", eta:0}],[{job_type:"", eta:0}],[{job_type:"", eta:0}],[{job_type:"", eta:0}],[{job_type:"", eta:0}],[{job_type:"", eta:0}],[{job_type:"", eta:0}],[{job_type:"", eta:0}]], 
     current_auto_video_jobs_urls: [], 
     loader: true 
    }; 



componentDidMount =() => { 

     var that = this; 

     this.init_get_media_files(); 

     refreshIntervalId = setInterval(this.get_process_status.bind(this), 60000); //new 

    } 

init_get_media_files() { 

     var that = this; 
     var URL_array = []; 

     auto_video_jobs_urls = []; 


     var settings = { 
      "async": true, 
      "crossDomain": true, 
      "url":url, 
      "method": "GET", 
      "headers": { 
       Authorization: "Token " + that.props.token_Reducer.token 
      }, 
      success: function (response, textStatus, jQxhr) { 
       response.results.map((item, i) => { 
        URL_array.push(item.url) 

        auto_video_jobs_urls.push(item.latest_process_status)//new 
       }) 
      }, 
     } 
     $.ajax(settings).done((response) => { 


      //alert("yo"); 
      that.setState({ 
       MediaFiles: response.results, 
       fileURLS: URL_array, 

       current_auto_video_jobs_urls: auto_video_jobs_urls 
      }) 


      this.get_first_process_status(); 

     }); 
    } 

私は実行すると、私はシーケンス

get_first_process_status() { //this is where problem comes 

     console.log("inside get_process_status") 
     // console.log("current jobs are" + auto_video_jobs_urls[1]) 
     console.log("jobs url array length is " + auto_video_jobs_urls.length) 

     auto_video_jobs_array = []; 

     //initialize index counter 
     let i = 0; 
     let that = this; 
     that.setState({loader:true}) 
     function next() { 
      $.ajax({ 
       async: true, 
       "crossDomain": true, 
       "url": that.state.current_auto_video_jobs_urls[i], 
       "method": "GET", 
       "headers": { 
        Authorization: "Token " + that.props.token_Reducer.token 
       }, 
       success: function(response, textStatus, jQxhr){ 
        ++i; 
        if(i >= that.state.current_auto_video_jobs_urls.length) { 
         // run function here as its the last item in array 
         console.log("i reached last value" + i + " " + response) 

         that.setState({current_auto_video_jobs: auto_video_jobs_array, loader:false}) 
         console.log("current jobs are" + that.state.current_auto_video_jobs[0]) 

        } else { 
         // do the next ajax call      
         auto_video_jobs_array.push(response) 
         next(); 
        } 
       } 
      }); 
     } 


     //start the first one 
     next(); 
    } 

でAJAX呼び出しを行う場所ですget_first_process_status 2回目に10秒後にエラーが発生し、メディアファイルが表示されます。これは、ajaxが正しい方法で実行されることを意味します。 current_auto_video_jobsが何らかの形で最初にマップされていない状態です。

これは初回でも有効でした。私は、エラーの理由を見ることができません "状態を取得する最後のajax呼び出しの最後に"未定義のプロパティ 'マップ'を読み取ることはできません。

これは私のマップ機能

{this.state.current_auto_video_jobs[i].map((item, i) => { 
                    let w; 
                    if (item.eta <= 1) { 
                     w = item.eta 
                    } 
                    else 
                     w = 0; 
                    let s = { 
                     width: ((w) * 100) + "%", 
                    }; 
                    return <a href="#" className="btn"> 
                     <div className="prog-medbtn" style={s}></div> 
                     {item.job_type}</a> 
                   } 
                  )} 

どのように私はこの問題を解決しますでしょうか?私はすべてを試しました。

また、async:falseを指定してajax呼び出しを実行すると、エラーは発生しません。

答えて

0

これはおそらくベストプラクティスではありませんが、私は時々ちょうど行うことでエラーを回避ます:、アイテムがまだ存在しない場合ようにするため

(this.state.current_auto_video_jobs[i] || []).map 

を、代わりにundefinedmapを呼び出そうとします代わりに空の配列上でそれを呼び出します。

+0

アレイは存在しません。私はコンソールで印刷されるのが分かります。私はあなたが提案した方法を試しました。 'current_auto_video_jobs'が空の配列であるときに私はまだエラー – ApurvG

+0

を受け取ります、' current_auto_video_jobs [i] 'は未定義です。 – dave

+0

はいわかっています。しかし、それを初期化している間も、いくつかの要素を入れているので、いつでも空の配列にすることはできません。あなたが私の州を定義した私のコードの始まりの部分ができます。 – ApurvG

関連する問題