【发布时间】:2016-10-31 11:47:17
【问题描述】:
我不熟悉承诺。似乎他们应该让事情变得更容易。但我无法弄清楚这一点。我想处理基于 http 状态码的承诺。即 200 与 301(PS 这是在咖啡脚本中)
所以我使用的是快递,我有一个承诺
express = require 'express'
router = express.Router()
Promise = require 'bluebird'
getRequest = (options) ->
new Promise (resolve, reject) ->
responseData = ''
http.get options, (response) ->
response.on 'data', (chunk) ->
responseData += chunk
response.on 'end', -> resolve responseData
....我想做一些事情,例如(这真的是伪代码)
getRequest
hostname: 'www.example.com'
port: 80
path: 'http://www.example.com' + some_path + '?json=1'
.then (if(response.statusCode is 200)) ->
response = JSON.parse(response)
res.render 'express/route',
data: response
.then (if(response.statusCode is 301)) ->
getRequest
hostname: 'www.example.com'
port: 80
path: response.headers.location + '?json=1'
.catch (error) ->
next(error)
关键是,如果第一个请求返回 301,我想使用该请求的新位置发出另一个请求。但似乎我能传回的只是回应。我必须将 301 视为错误吗?或者有没有办法以不同的方式编写 response.on ?还是 .then() 语句?我真的很茫然。
【问题讨论】:
-
(在最后一个 .then() getRequest 中它会做一些事情)
-
getRequest在哪里生成带有statusCode的对象? -
在函数内你可以做 response.on 'data', (chunk) -> this.statusCode
-
那么您可能应该使用
resolve {status: @statusCode, data: responseData}在thencallbac 中访问它们
标签: express coffeescript promise bluebird