[英]How do I use node Promise and http together?
我正在嘗試了解節點中的Promises。 我希望能夠將http.request用作承諾。 這是我到目前為止所學到的。
我使用setTimeout設置了一個測試用例,如下所示:
var makePromise = (txt, milli) => {
return new Promise((resolve, reject) => {
setTimeout(() => { // fn(cb)
console.log("I promise to...")
resolve(txt)
}, milli)
});
}
var p = makePromise("Come Home", 3000);
var q = makePromise("Go Shopping", 1000);
var tasks = [p, q];
console.log("Start with ", tasks);
Promise.all(tasks).then((res) => {
console.log(res);
console.log("Finish");
})
這很好。 現在我想我所要做的就是用適當的http.request替換setTimeout函數。 但這似乎並不那么簡單。
這是當前的嘗試。
var makePromise = (collection, item) => {
var options = {
method: "PUT",
port: 9000,
host: "localhost",
path: `/${collection}/item/${item.Label.itemUUID}`,
headers: {
"Accept": "application/json",
"Content-type": "application/json",
"Content-length": JSON.stringify(req.body).length
}
};
console.log(JSON.stringify(options));
var httpPromise = new Promise((resolve, reject) => {
var vot = http.request(options, (votResponse) => {
var responseBody = [];
votResponse.on('data', (chunk) => {
console.log(`Got ${chunk.length} ${chunk}`);
responseBody.push(chunk);
});
votResponse.on('end', () => {
console.log("End of http");
console.log("After web proxy like call - raw data: ", Buffer.concat(responseBody).toString());
responseBody.json = JSON.parse(Buffer.concat(responseBody).toString());
resolve(responseBody.json);
});
votResponse.on('error', (err) => {
reject(err);
});
})
vot.write(JSON.stringify(item));
vot.end();
});
return httpPromise;
};
我知道有一些像“請求承諾”之類的庫可以提供幫助,但是我希望在使用庫之前對本機操作有更深入的了解。 誰能指出我如何使這種方法起作用?
調用代碼如下所示:
var collection = req.params.collection;
var patchInstruction = req.body.patchInstruction;
switch (patchInstruction) {
case "CASCADE DELETE":
console.log("CASCADE DELETE on", collection, req.body.item);
var tasks = [req.body.item].concat(req.body.asSubject).concat(req.body.asObject);
tasks = tasks.map((e, i, a) => {
e.Item = "DELETED"
return makeDeletePromise(collection, e); // a promise to do the http PUT
});
console.log("WIP ", tasks);
Promise.all(tasks).then((res) => {
console.log("To client --> ",res);
res.send(res);
})
break;
default:
console.log("No path to ",patchInstruction);
res.send(409);
break;
}
永遠不會發生對端口9000的調用。
它總是一個好主意,以結束與一個承諾鏈條catch
通話。 否則,在諾言鏈中發生的任何錯誤都會被“吞噬”-您根本看不到它。
因此,任何時候有then
應該有一個catch
。
Promise.all(tasks).then((res) => {
console.log("To client --> ", res);
res.send(res);
}).catch((err) => console.log(err));
我相信,錯誤是在res.send(res)
附近,因為http的res
被本地res
。 這實際上是responseBody.json
,因此它沒有send
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.