私はノードの約束について学んでいます。私は約束としてhttp.requestを使用できるようにしたい。これは私がこれまでに学んだことです。ノードPromiseとhttpを一緒に使用するにはどうすればよいですか?
下図のように私は、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");
})
これが正常に動作します。今私は、必要なのは、setTimeout関数を適切なhttp.requestに置き換えることだと思いました。しかしそれはそれほど単純ではないようです。
ここでこれが現在の試みです。
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へのコールが起こることはありません。
どうしたらうまくいかないのですか? – alexmac
呼び出しコードが追加されました。 – user2302244
https://github.com/request/request-promise/blob/master/lib/rp.js – jfriend00