$ .each等待每个对象的承诺

时间:2016-03-30 13:16:20

标签: javascript jquery ajax callback promise

我有另一个回调/承诺问题: - )

我试图实现一系列函数,每个函数都在等待下一个函数的返回值。

我有一个ajax调用,在成功时返回成功的json 阻止我将此json发送到异步功能验证

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);
}

1 个答案:

答案 0 :(得分:-2)

  • 选项1: 使用回调 -

        validation(data.responseObj, function(){
    
        })
    
        function validation(responseObj, callback) {
    
           //your code....
    
           callback(validArr)    
        }
    
    • 选项2:使用承诺 -

      验证(data.responseObj)。然后(函数(validArr){
      });

      函数验证(responseObj,callback){

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

      }