Node.jsのRESTfulAPIを使用してリモートデータベースに製品を追加するスクリプトがあります。うまく機能しますが、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チャネルがあるたびに、最も優先度の高いアイテムを取得する必要があります。