问题
What is the correct way to call the same function on an array of objects using callbacks to advance?
Essentially processing asynchronous calls sequentially.
doAsynchFunction(data,callback){
console.log(data);
wait(1000,callback); // do something that takes some time and execute callback
}
var a=[1,2,3,4,5,6];
I'd like to see the numbers appear 1 second apart
回答1:
You could use Promise.all() to process asynchronous processes where the result could be returned in any order
var queue = [0, 1, 2, 3, 4, 5, 6, 7];
function asyncFn(n) {
return new Promise(function(resolve) {
setTimeout(function() {
console.log("processing:", n)
resolve(n)
}, Math.random() * 3000)
})
}
Promise.all(queue.map(function(value) {
return asyncFn(value)
}))
.then(function(results) {
console.log(results)
})
.catch(function(err) {
console.log(err)
})
or use a queue to process asynchronous functions in sequential order
var queue = [0, 1, 2, 3, 4, 5, 6, 7]
, res = []
, queueCopy = queue.slice(0);
function asyncFn(n) {
return new Promise(function(resolve) {
setTimeout(function() {
console.log("processing:", n)
resolve(n)
}, Math.random() * 3000)
})
}
function processQueue(arr) {
return asyncFn(arr.shift())
.then(function(result) {
res.push(result)
if (arr.length) {
return processQueue(arr)
} else {
return res
}
})
}
processQueue(queueCopy)
.then(function(results) {
console.log(results)
})
.catch(function(err) {
console.log(err)
})
Adjusting js at updated Question to utilizing setTimeout(), Function.prototype.bind() to pass function reference with parameters to setTimeout. Note, callback in this instance would be doAsynchFunction itself.
var a = [1, 2, 3, 4, 5, 6], aCopy = a.slice(0);
function wait(duration, callback) {
setTimeout(function() {
callback()
}, duration)
}
function doAsynchFunction(arr, cb) {
console.log(arr.shift());
// pass `arr`, and `cb` : `doAsynchFunction` to `wait`
if (arr.length) wait(1000, cb.bind(null, arr, cb));
}
doAsynchFunction(aCopy, doAsynchFunction);
回答2:
this is what I'm using right now
function run(onEnd){
data=[1,2,3,4,5,6,7,8,9,10];
var proc = function(){
if(i<data.length){
dosomething(data[i],proc);
}else{
onEnd()
}
i++;
}
proc();
}
来源:https://stackoverflow.com/questions/35777616/executing-function-on-array-using-callbacks