Ich versuche, über Versprechen in Knoten zu lernen. Ich möchte in der Lage sein, die http.request als Versprechen zu verwenden. Das habe ich bisher gelernt.Wie verwende ich Knoten Promise und http zusammen?
stelle ich einen Testfall mit setTimeout oben wie unten dargestellt:
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");
})
Dies funktioniert gut. Jetzt dachte ich, dass ich nur die Funktion setTimeout durch die entsprechende http.request ersetzen müsste. Aber so einfach scheint das nicht zu sein.
Hier ist der aktuelle Versuch dazu.
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;
};
Ich weiß, es gibt Bibliotheken wie „request-Versprechen“, die helfen können, aber ich bin daran interessiert, ein tieferes Verständnis für die nativen Operationen zu erhalten, bevor eine Bibliothek. Kann jemand darauf hinweisen, wie ich diesen Ansatz zur Arbeit bringen könnte?
Der Aufruf-Code wird hier gezeigt:
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;
}
Der Aufruf an Port 9000 kommt nie vor.
Was funktioniert nicht? – alexmac
Der aufrufende Code wurde hinzugefügt. – user2302244
Sie können einfach den Quellcode für Anfrage Versprechen hier: https://github.com/request/request-promise/blob/master/lib/rp.js – jfriend00