最近,我遇到了以下編碼挑戰。請幫我解決這個問題。
您的任務是實作一個 NodeJS 服務器,該服務器公開一個用于運行異步任務的端點。更準確地說,服務器必須接受以下請求:
發布 /api/runTasks
并且請求的有效負載是 JSON 格式的物件;例如:
{
"taskIds": ["id422", "id2444", "id424", "id4242"]
}
該陣列由需要運行的任務的 ID 組成。
您將獲得具有以下方法的 TaskRunner 服務:
- runTask(id: string): 承諾
- hasTask(id: string): 布林值
runTask 方法是異步的,并回傳一個可能在隨機時間后解決的承諾。對端點的請求應該同時啟動所有任務的執行,以便它們可以并行作業,并且應該在所有任務完成后立即回傳回應。它應該回傳一個與 taskIds 陣列長度相同的陣列,并表示任務以下列方式完成的順序:
- 如果 taskIds 陣列中所有索引低于 i 的任務在第 i 個任務完成之前已完成,則陣列的第 i 個專案等于 i - 換句話說,當第 0、第 1、第 2、... , (i-1)-th 個任務在第 i 個任務完成之前完成;
- 否則,第 i 個專案應該等于 -1。
如果 taskIds 包含至少一個未在 TaskRunner 中注冊的任務的 ID,則端點應回傳狀態代碼 400(您可以使用 has Task 方法檢查這一點)。如果發生這種情況,您必須確保沒有運行任何任務。如果你碰巧在一個無法識別的任務 ID 上執行了 TaskRunner.runTask,該方法回傳的 Promise 將被拒絕。
假設:
- taskIds 陣列長度的最大值為 200。
- 您可能希望在請求的有效負載中至少發送 1 個任務 ID。
- 只允許一個匯入:express (v4.17.1)
例子
示例 1
假設發送了一個具有四個任務 ID 的請求。TaskRunner 可以識別所有任務 ID。給定任務的執行順序是:0、2、1、3,也就是說:
- 第一個完成的任務是 taskIds 陣列中第一個任務 ID 的任務;
- 第二個完成的任務是陣列中具有第三個任務 ID 的任務;
- 第三個完成的任務是陣列中第二個任務 ID 的任務;
- 最后完成的任務是陣列中具有最后一個任務 ID 的任務。
因此,回應應該有狀態碼 200 并且正文應該是一個陣列:
[0, 1, -1, 3]
示例 2
除了執行順序之外,讓我們做出與第一個示例相同的假設,在本例中為:0、1、2、3。回應正文應該是一個陣列:
[0, 1, 2, 3]
示例 3 類似地,如果執行順序為 3、2、1、0,則回應正文應為:
[0, -1, -1, -1]
示例 4
如果執行順序是2、0、3、1、5、4,那么回應體應該是:
[0, -1, 2, -1, 4, -1]
示例 5
另一方面,如果在請求中提供了四個任務 ID,其中一個尚未在 TaskRunner 服務中注冊,則回應的狀態代碼應為 400,并且不應運行任何任務。
這是初始代碼塊:
const express = require('express');
const TaskRunner = require('./taskRunner.js');
const app = express();
app.use(express.json());
app.post('/api/runTasks', async (req, res, next) => {
try {
//...
} catch (error) {
next(error);
}
});
exports.default = app.listen(process.env.HTTP_PORT || 3000);
uj5u.com熱心網友回復:
我創建了自己的 TaskRunner 并解決了這個問題。我在下面附上了整個代碼。你可以在這里自己嘗試整個專案:https ://github.com/talent-jsdev/e-taskrunner
const express = require('express');
const TaskRunner = require('./taskRunner.js');
const app = express();
app.use(express.json());
app.post('/api/runTasks', async (req, res, next) => {
const taskIds = req.body.taskIds;
let resOrder = [];
for (let i = 0; i < taskIds.length; i ) {
if (!TaskRunner.hasTask(taskIds[i])) {
return res.status(404).json({ "error": "no Task" });
}
}
try {
taskIds.forEach(async taskId => {
await TaskRunner.runTask(taskId)
resOrder.push(taskIds.indexOf(taskId));
if (resOrder.length == taskIds.length) {
return res.status(200).json(getResult(resOrder));
}
})
} catch (error) {
return next(error);
}
});
const getResult = (order) => {
let res = [0];
for (let i = 1; i < order.length; i ) {
for(let j = 0; j < i; j ) {
if (order.indexOf(i) < order.indexOf(j)) {
res.push(-1);
break;
}
if (j == i - 1) {
res.push(i)
}
}
}
return res;
}
exports.default = app.listen(process.env.HTTP_PORT || 3000);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/523056.html
