向数组添加多个回调响应
Add multiple callback responses to array
我有这个称为checkForURLS
的多个函数,它调用另两个返回回调的函数,我如何添加到数组中,一旦两个回调都返回,然后返回数组作为回调?我正在使用纯JavaScript。
function checkForURLs(uniqueURL, customURL, callback) {
var errors = [];
checkForUniqueURL(uniqueURL, function(UniqueURLCallback) {
if (UniqueURLCallback===true) {
errors.push("This unique URL is already taken, please try another.");
}
});
if (customURL.length>0) {
checkForCustomURL(customURL, function(customURLCallback) {
if (customURLCallback===true) {
errors.push("This custom URL is already taken, please try another.");
}
});
}
if (errors.length>0) {
return callback(errors);
} else {
return callback(false);
}
}
可以在调用checkForUniqueURL
和checkForCustomURL
回调函数后,使用Promise
构造函数new Promise(function)
、Promise.all()
来执行任务。
function callback(value) {
return value
}
function checkForUniqueURL(url, callback) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(callback(true))
}, Math.random() * 1500)
})
}
function checkForCustomURL(url, callback) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(callback(true))
}, Math.random() * 1500)
})
}
function checkForURLs(uniqueURL, customURL, callback) {
var errors = [];
return Promise.all([
new Promise(function(resolve, reject) {
checkForUniqueURL(uniqueURL, function(UniqueURLCallback) {
if (UniqueURLCallback === true) {
errors.push("This unique URL is already taken, please try another.");
}
resolve()
})
})
, new Promise(function(resolve, reject) {
if (customURL.length > 0) {
checkForCustomURL(customURL, function(customURLCallback) {
if (customURLCallback === true) {
errors.push("This custom URL is already taken, please try another.");
}
resolve()
});
}
})
])
.then(function() {
console.log(errors);
if (errors.length > 0) {
return Promise.resolve(callback(errors));
} else {
return Promise.reject(callback(new Error("false")));
}
})
}
checkForURLs("abc", "def", callback)
.then(function(errs) {
console.log(errs);
})
.catch(function(err) {
console.log("err:", err.message)
})
如果您使用的所有函数都是同步的,并且实现方式与以下类似,那么您的代码就可以很好地工作:
function checkForURLs(uniqueURL, customURL, callback) {
var errors = [];
checkForUniqueURL(uniqueURL, function(UniqueURLCallback) {
if (UniqueURLCallback===true) {
errors.push("This unique URL is already taken, please try another.");
}
});
if (customURL.length>0) {
checkForCustomURL(customURL, function(customURLCallback) {
if (customURLCallback===true) {
errors.push("This custom URL is already taken, please try another.");
}
});
}
if (errors.length>0) {
return callback(errors);
} else {
return callback(false);
}
}
// Just test-implement those two functions:
function checkForUniqueURL(url, callback) { callback(true); }
function checkForCustomURL(url, callback) { callback(true); }
errors = checkForURLs("test", "test2", function(errors) {
console.log(errors);
return "I have got some errors!";
});
console.log(errors);
如果您的代码确实有异步部分,则需要使用return callback()
"等待"直到这些部分完成。也许可以将它们包装在另一个回调中?
如果checkForUniqueURL
和checkForCustomURL
函数是同步的,这将工作。下面是它与同步函数一起工作的例子…
然而,我将假设,因为它不起作用,你的函数是异步的。这里有一个例子,它不工作与异步函数…
https://jsfiddle.net/uzjbyrt7/它不起作用,因为checkForURLs
函数在回调函数被触发之前返回。在这种情况下,最好的解决方案是Promises。但是,您可能需要使用库来获得承诺支持,因为它们尚未在所有浏览器中实现。我推荐bluebird.js。下面是一个使用异步函数和承诺的例子…
相关文章:
- 如何收集所有发射回调的所有响应
- jQuery post,访问responseType或回调中的响应
- node.js+MySQL;JSON结果-回调问题&没有响应客户端
- 可以't从回调函数内部访问响应
- 回调返回响应,但当在API中发送时,响应在节点JS中显示为空白
- 挂起的回调:在每次回调返回之前返回响应
- Node.JS-如何识别哪个异步HTTPGET响应在回调中返回数据
- 具有一个响应的多个回调-Node JS
- React native:如何将参数传递给手势响应程序回调
- POST 响应未等待回调完成
- Facebook Javascript SDK 响应回调未触发
- GreaseMonkey 和 JQuery AJAX 响应不会以任何形式在回调中幸存下来
- 如何为每个 AJAX 请求/响应事件添加回调
- 节点.js如果我使用 process.send(),请等待回调/响应
- 如何在angularjs中使用factory在GPS检测器函数内部使用$http.post方法时获得回调响应
- 如何在ejb中处理回调响应
- 如何传递javascript回调响应到php
- 向数组添加多个回调响应
- Backbone.Wreqr 请求-响应处理程序的回调响应/状态(完成后)
- Strophejs获得花名册成功回调响应