【发布时间】: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