使用回调在数组上执行函数

时间:2016-03-03 16:24:53

标签: javascript callback

使用回调推进在对象数组上调用相同函数的正确方法是什么?

基本上按顺序处理异步调用。

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秒

2 个答案:

答案 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();
}