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]