Javascript 然后将回调函数排队等待执行

Javascript 然后将回调函数排队等待执行,javascript,node.js,asynchronous,callback,queue,Javascript,Node.js,Asynchronous,Callback,Queue,我想创建一个函数,使回调函数排队,但在该回调退出队列并执行之前不会返回 function executeCallback(callback) { if( shouldEnqueue ) { enqueue(callback); // awaits execution of callback // return executed callback's return value } else { return callback()

我想创建一个函数,使回调函数排队,但在该回调退出队列并执行之前不会返回

function executeCallback(callback) {
    if( shouldEnqueue ) {
      enqueue(callback);
      // awaits execution of callback
      // return executed callback's return value
    } else {
      return callback()
    }
}
实际函数的工作原理如下。当需要订购本时,我们将检查是否缓存了最近的订购本。如果我们没有最近的订单,我们将对新订单的请求进行排队。我们将在收到请求后立即返回订单簿。实际代码如下所示:

const axios = require("axios");
const moment = require("moment");
const { promisify } = require("util");

const orderbookQueue = [];
const orderbookUpdateTime = {};

async function requestOrderbook(pair) {
  const response = await axios.post("https://api.kraken.com/0/public/Depth", {
    pair
  });
  orderbookUpdateTime[pair] = +moment();
  return response.data.result[pair];
}

async function getOrderbook(pair, currentTime) {
  if (
    orderbookUpdateTime[pair] &&
    currentTime - orderbookUpdateTime[pair] > 60000
  ) {
    const requestOrderbookAsync = promisify(requestOrderbook);
    orderbookQueue.push(() => requestOrderbookAsync(pair));
    // how to I return the result of requestOrderbookAsync when it has been called ?
  }
  return requestOrderbook(pair);
}

const queueExecutor = function queueExecutor() {
  while (orderbookQueue.length) {
    orderbookQueue[0]();
    orderbookQueue.shift();
  }
};

1。将您的回电转换为承诺

例如,转换

function mutilpy(a, b, callback) {
    let result = a*b;
    return callback(result);
}

2。(有点)将回调排队等待完成

var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = multiply(10,3);

Promise.all([promise1, promise2, promise3]).then(function(values) {
    // YOU GET HERE WHEN ALL PROMISES ARE RESOLVED
    console.log(values);
});
// expected output: Array [3, 42, 30]

我找到了一个适合我的解决方案。可以从新的承诺中提取解析函数,将解析函数放入不同的作用域中,然后随时在任何作用域中退出并执行解析函数


创建一个承诺,该承诺在完成时会得到解决。我无法确定如何访问已解决的承诺。你能用代码或伪代码告诉我你的意思吗?给我们看看你的代码。好的,我编辑了这个问题以包含真实的代码。我需要在每个用户请求数据时,按顺序将已解决的承诺返回给他们。因此,新请求将在随机时间排队。已解决的承诺需要在解决后立即返还。
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = multiply(10,3);

Promise.all([promise1, promise2, promise3]).then(function(values) {
    // YOU GET HERE WHEN ALL PROMISES ARE RESOLVED
    console.log(values);
});
// expected output: Array [3, 42, 30]