我有一个脚本,它使用 Node.js 中的 RESTful API 将产品添加到远程数据库。它运行良好,但我想更改处理 HTTP 请求的优先级。这里有一些代码可以更好地说明我正在尝试做的事情:
step(
function initializeCategories() {
createCategories(products, this);
},
function createProducts(err, categoriesHash) {
console.log("\nCreating products:");
console.log("==================");
var group = this.group(),
productDoneCallback;
products.forEach(function (product) {
product.categories = categoriesHash[product.category + "/" + product.make + "/" + product.model];
productDoneCallback = group();
step(
function createProduct() {
postProduct(convertToBigCommerceObj(product), this);
},
function overwriteProduct(err, product, allowOverwrite) {
if (err) {
console.log(err);
}
allowOverwrite = allowOverwrite || false;
if (allowOverwrite) {
updateProduct(product, this);
} else {
this(err, product);
}
},
function addExtraInfo(err, product) {
addImage(product, productDoneCallback);
}
);
});
},
function printStats(err) {
if (err) {
logError(err);
}
var endTime = +new Date(),
duration = endTime - startTime;
console.log("\nFinished after " + (duration / 1000 / 60) + " minutes");
console.log(productsAdded + " Products added successfully");
console.log(productsUpdated + " Products updated successfully");
console.log(productsSkipped + " Products skipped");
console.log("Average time (milliseconds) per product was : " + (duration / totalNumProducts ));
console.log("For more information see error log (error.log)" );
}
);
在此代码中,始终在添加所有产品后最后添加产品图像。这是因为 forEach 循环立即将所有 postProduct 请求放入节点事件队列中。在第一个产品完成发布到服务器后,另一个条目被添加到队列的末尾以添加该产品的图像。相反,我希望新条目浮动到队列顶部并成为下一个要处理的条目(不是另一个产品帖子,可以等待)。
我意识到要做到这一点,我需要一个优先级队列。我只是不确定如何在 Node 和 Javascript 中实现这一点。
更新:在https://github.com/STRd6/PriorityQueue.js找到 PriorityQueue 的实现后,真正的麻烦是每次请求完成时异步处理队列。或者更像是每次有可用的 http 通道被释放时,我们需要获取最高优先级的项目。