2016-04-23 10 views
0

私はノードの約束について学んでいます。私は約束として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へのコールが起こることはありません。

+0

どうしたらうまくいかないのですか? – alexmac

+0

呼び出しコードが追加されました。 – user2302244

+1

https://github.com/request/request-promise/blob/master/lib/rp.js – jfriend00

答えて

0

catchコールで約束を終了することをお勧めします。さもなければ、約束のチェーン内で起こるエラーは「飲み込まれる」でしょう - あなたは単にそれを見ません。

したがって、いつでもthenがある場合は、catchである必要があります。

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

私は、httpのresがローカルresの影されているためエラーが、どこかres.send(res)近くにある、と信じています。実際にはresponseBody.jsonなので、sendメソッドはありません。

関連する問題