我有另一个回调/承诺问题: - )
我试图实现一系列函数,每个函数都在等待下一个函数的返回值。
我有一个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);
}
答案 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
}