2016-04-23 6 views
0

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.

+0

Was funktioniert nicht? – alexmac

+0

Der aufrufende Code wurde hinzugefügt. – user2302244

+1

Sie können einfach den Quellcode für Anfrage Versprechen hier: https://github.com/request/request-promise/blob/master/lib/rp.js – jfriend00

Antwort

0

Es ist immer eine gute Idee, eine Versprechenskette mit einem catch Anruf zu beenden. Andernfalls würde jeder Fehler, der innerhalb einer Versprechenskette passiert, "verschluckt" werden - Sie werden es einfach nicht sehen.

So, jederzeit gibt es eine then sollte es eine catch sein.

Promise.all(tasks).then((res) => { 
    console.log("To client --> ", res); 
    res.send(res); 
}).catch((err) => console.log(err)); 

glaube ich, ein Fehler irgendwo in der Nähe von res.send(res) ist, weil http der res von lokalen res abgeschattet wird. Welches ist wirklich ein responseBody.json, so hat es keine send Methode.

Verwandte Themen