【问题标题】:$.each wait for promise from each object [duplicate]$.each 等待每个对象的承诺 [重复]
【发布时间】:2016-07-18 12:38:40
【问题描述】:

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

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

我有一个 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);
}

【问题讨论】:

  • 什么是getScript(),为什么每次调用validation() 时都调用它? _checkDoc() 是什么?谁打电话给checkStory()
  • 除了@Tomalak的评论,DM.ct是什么?
  • @Tomalak、_checkDoc() 和 checkStory() 是我当前脚本中的其他函数,并未在我的流程中使用。验证不是每次都被调用,在验证中我正在为我的响应中的每个对象执行 aviliabilty() 。 DM.ct 是来自外部脚本的函数。

标签: javascript jquery ajax callback promise


【解决方案1】:
  • 选项 1: 使用回调 -

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

      验证(data.responseObj).then(函数(validArr){
      });

      函数验证(responseObj,回调){

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

      }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2019-07-27
    • 2018-04-17
    相关资源
    最近更新 更多