使用回调推进在对象数组上调用相同函数的正确方法是什么?
基本上按顺序处理异步调用。
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];
我希望看到这些数字相隔1秒
答案 0 :(得分:1)
您可以使用Promise.all()
来处理可以按任何顺序返回结果的异步进程
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)
})

或使用队列按顺序处理异步函数
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)
})

在更新的问题中调整js
以使用setTimeout()
,Function.prototype.bind()
将带参数的函数参考传递给setTimeout
。请注意,此实例中的callback
本身就是doAsynchFunction
。
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);

答案 1 :(得分:0)
这就是我现在正在使用的
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();
}