Поставьте в очередь функции обратного вызова и дождитесь их выполнения - PullRequest
0 голосов
/ 24 мая 2018

Я хочу создать функцию, которая ставит в очередь функции обратного вызова, но не возвращает до тех пор, пока этот обратный вызов не будет снят с очереди и выполнен.

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

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Я нашел решение, которое работает для меня.Можно извлечь функцию разрешения из нового Обещания, поставить функцию разрешения в другую область, а затем снять и выполнить функцию разрешения каждый раз, когда наступит время, в любой области.

Разрешить функцию Javascript Promise вне функциисфера

0 голосов
/ 25 мая 2018

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]
...