【问题标题】:Enqueue callback functions then await their execution排队回调函数然后等待它们的执行
【发布时间】:2018-11-04 04:20:44
【问题描述】:

我想创建一个将回调函数入队的函数,但在该回调出队并执行之前不会返回。

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

【问题讨论】:

  • 创建一个完成后解析的承诺。
  • 我无法弄清楚如何访问已解决的承诺。你能用代码或伪代码告诉我你的意思吗?
  • 向我们展示您的代码。
  • 好的,我编辑了问题以包含真实代码。

标签: javascript node.js asynchronous callback queue


【解决方案1】:

我找到了适合我的解决方案。可以从一个新的 Promise 中提取 resolve 函数,将 resolve 函数加入到不同的作用域中,然后在时间到来时在任何作用域中出列并执行 resolve 函数。

Resolve Javascript Promise outside function scope

【讨论】:

    【解决方案2】:

    1.将您的回调转换为承诺

    例如,转换

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

    function multiply(a, b) {
        return new Promise(function(resolve, reject) {
            let result = a*b;
            resolve(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]
    

    【讨论】:

    • 我需要在每个用户请求数据时按顺序将已解决的承诺返回给他们。因此,新请求将随机排队。已解决的 Promise 需要在解决后立即返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多