2016-03-30 10 views
0

からの約束を待つ.each 。

成功時にjsonを返すajax呼び出しがあります。 ブロックこの非同期関数を非同期関数検証に送信しています。

私はスクリプトをロードしていると私は 可用性機能に送る各オブジェクトのために、私が完了すると値を返すために可用性を待ちたい、リターンです各値はに 押されている validation()

私は最後にそれを送信したい配列。

コールバックの実装に問題があります。

var validArr = []; 

function checkStory(callback) { 
    $.ajax({ 
    url: "", 
    type: "GET", 
    data: "", 
    async: true, 
    headers: { 
     Accept: "application/json" 
    }, 
    success: function(data) { 
     if (data.isDoc == true) { 
     _checkDoc(callback); 
     } else { 
     if (data.responseObj) { 
      validation(data.responseObj); 
     } else { 
      callback(data.count); 
     } 
     } 
    }, 
    error: function(err) { 
     console.log("No books"); 
    } 
    }); 
} 

function validation(responseObj) { 
    getScript('books.js', 
    function() { 
     $.each(responseObj, function(_index, _value) { 
     var res = aviliabilty(_value); 
     if (res) { 
      validArr.push(_index, true); 
     } else { 
      validArr.push(_index, false); 
     } 
     }); 
     //return after all objects completed execution 

     return validArr; 
    } 
); 
} 

function aviliabilty(entry) { 
    DM.ct.get(entry, function(response) { 
    if (response) { 
     for (var idx = 0, adLen = response.ds.length; idx < adLen; idx++) { 
     var bk = response.ds[idx]; 
     for (var creaIdx = 0, crea = bk.creatives.length; creaIdx < crea; creaIdx++) { 
      var creative = bk.creatives[creaIdx]; 
      if (creative.type == "line") { 
      for (var mfIdx = 0, mfLen = creative.Files.length; mfIdx < mfLen; mfIdx++) { 
       var mediaFile = creative.Files[mfIdx]; 
       if (mediaFile.type == "horror") { 
       return true; 
       } 
      } 
      } else if (creative.type != "horror") { 
      return false; 
      } 
     } 

     } 
    } 

    }); 
} 


// a function to get the script asynchronously 
function getScript(url, success) { 
    var script = document.createElement('script'); 
    script.src = url; 
    var head = document.getElementsByTagName('head')[0], 
     done = false; 
    // Attach handlers for all browsers 
    script.onload = script.onreadystatechange = function() { 
     if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) { 
      done = true; 
      success(); 
      script.onload = script.onreadystatechange = null; 
      head.removeChild(script); 
     } 
    }; 
    head.appendChild(script); 
} 
+0

、なぜあなたは '検証()'であるたびに、それを呼ぶのですかと呼ばれる? '_checkDoc()'とは何ですか?誰が 'checkStory()'を呼び出しますか? – Tomalak

+0

@ Tomalakのコメントに加えて、 'DM.ct'とは何ですか? –

+0

@Tomalak、_checkDoc()およびcheckStory()は、現在のスクリプトでは他の関数であり、自分のフローでは使用されていません。検証は毎回呼び出されるのではなく、検証で私は応答内の各オブジェクトに対してaviliabilty()を実行しています。 DM.ctは外部スクリプトの関数です。 – ohadsas

答えて

-2
  • オプション1: コールバックを使用する -

    validation(data.responseObj, function(){ 
    
        }) 
    
        function validation(responseObj, callback) { 
    
         //your code.... 
    
         callback(validArr)  
        } 
    
    • オプション2:使用の約束 -

      バリデーション(data.responseObj).then(関数(validArrを){
      });

      機能の検証(responseObj、コールバック) `getScript()`は何{

      var defer = Q.defer() 
          //your code.... 
      
          defer.resolve(validArr) 
      
          return defer.promise 
      

      }

関連する問題