按升序执行回调

时间:2018-05-16 23:49:12

标签: javascript asynchronous callback

附件是我写的问题和解决方案代码。基本上回调应该是控制台按升序记录输出而不是它接收的顺序。

function processRequest(i, callback) {
  setTimeout(function() {
    callback('Action processed ' + i);
  }, Math.random() * 1000);
}

callAction(6);

callAction(count) {
  //write code here
}

预期输出>>

    Action processed 1
    Action processed 2
    Action processed 3
    Action processed 4
    Action processed 5
    Action processed 6

我知道这不是解决这个问题的最佳方法。有人可以评价我的解决方案并可能提出更好的方法吗?我猜的是异步的东西?

非常感谢!谢谢。

function processRequest(i, callback) {
  setTimeout(function() {
    callback('Action processed ' + i);
  }, Math.random() * 1000);
}

callAction(6);

function callAction(count) {
  const arr = [];
  let counter = 0;
  for (let i = 1; i <= count; i++) {
    arr[i - 1] = i;
  }
  for (let i = 1; i <= count; i++) {
    processRequest(i, function(str) {
      counter++;
      let currentActionNum = parseInt(str.match(/\d+/g));
      let message = str.substr(0, str.indexOf(currentActionNum));
      if (currentActionNum === arr[0]) {
        console.log(message + currentActionNum);
        arr.shift();
      }
      if (counter === count) {
        for (let i = arr[0]; i <= count; i++) {
          console.log(message + i);
        }
      }
    });
  }
}

2 个答案:

答案 0 :(得分:0)

我认为采访者希望你做的是确保这些流程以正确的顺序运行(现实生活中的流程会有所不同,而不仅仅是打印一些字符串)。所以,这是一个更好的解决方案:

function callAction(count){
    i = 1;
    cb = function(str){
        console.log(str)
        count-i++ && processRequest(i, cb) //'same' as: if (count-i++>0) then ...
    }    
    processRequest(1, cb)
}

出于好奇,我可以问一下这是面对面的采访吗?你有权使用电脑吗?你需要多长时间才能解决这个问题?如果我没有计算机和我一起试试,那么我可能会做得比这更糟糕......

答案 1 :(得分:0)

您的任务不是使用超复杂的处理来重写输出以正确的顺序出现,而是确保6个进程按顺序运行。你可以用一个简单的递归方法来做到这一点:

function callAction(count) {
    if (count > 1)
        processRequest(7 - count, result => {
//                     ^^^^^^^^^ ok, that part is a bit weird
            console.log(result);
            callAction(count - 1);
        });
}