function handle(cb) { return function (error, response, body) { if( error ) { util.debug(error) } else { var code = response.statusCode var json = JSON.parse(body) util.debug(' '+code+’: '+JSON.stringify(json))
assert.equal(null,error)
assert.equal(200,code)
cb(json)
}
} }
function get(username,uri,cb){ util.debug('GET '+uri) request.get( { uri:uri, headers:headers[username] || {} }, handle(cb) ) }
function post(username, uri,json,cb){ util.debug('POST '+uri+’: '+JSON.stringify(json)) request.post( { uri:uri, json:json, headers:headers[username] || {} }, handle(cb) ) }
module.exports = {
api:function() { var foo = ('’+Math.random()).substring(10) var bar = ('’+Math.random()).substring(10)
// create and load
;post(
null,
urlprefix+'/user/register',
{username:foo},
function(json){
assert.ok(json.ok)
headers[foo] = {
'x-lifestream-token':json.token
}
;get(
foo,
urlprefix+'/user/'+foo,
function(json){
assert.equal(foo,json.username)
assert.equal(0,json.followers.length)
assert.equal(0,json.following.length)
;post(
null,
urlprefix+'/user/register',
{username:bar},
function(json){
assert.ok(json.ok)
headers[bar] = {
'x-lifestream-token':json.token
}
;get(
bar,
urlprefix+'/user/'+bar,
function(json){
assert.equal(bar,json.username)
assert.equal(0,json.followers.length)
assert.equal(0,json.following.length)
// search
;get(
null,
urlprefix+'/user/search/'+foo.substring(0,4),
function(json){
assert.ok(json.ok)
assert.equal(1,json.list.length)
assert.equal(json.list[0],foo)
;}) // search
;}) // get
;}) // post
;}) // get
;}) // post
} }
@DavidCai1993 这是书上的例程,我都看瞎了,它是用expresso执行的测试程序,每个要测试的功能post、gei等,是一个个嵌套着的,但我以为会从最里面的一层开始执行,因为函数是先执行它的参数的嘛,但看结果却是先执行的post,所以这样看是顺序执行的,就是从外层到内层执行的。刚执行第一次post,到handle(cb)这里就没动静了,我也看不懂这个handle(cb),所以蛋疼啊
@xiuxu123 这是书上的例程,我都看瞎了,它是用expresso执行的测试程序,每个要测试的功能post、gei等,是一个个嵌套着的,但我以为会从最里面的一层开始执行,因为函数是先执行它的参数的嘛,但看结果却是先执行的post,所以这样看是顺序执行的,就是从外层到内层执行的。刚执行第一次post,到handle(cb)这里就没动静了,我也看不懂这个handle(cb),所以蛋疼啊
@littleshe 这是书上的例程,我都看瞎了,它是用expresso执行的测试程序,每个要测试的功能post、gei等,是一个个嵌套着的,但我以为会从最里面的一层开始执行,因为函数是先执行它的参数的嘛,但看结果却是先执行的post,所以这样看是顺序执行的,就是从外层到内层执行的。刚执行第一次post,到handle(cb)这里就没动静了,我也看不懂这个handle(cb),所以蛋疼啊
我感觉handle(cb)是把回调的错误处理抽象出来,有错误打印错误,没错误执行cb(JSON.parse(body)); get和post嵌套,从外向里按顺序执行,具体好像是模拟从个人空间–>注册–>个人空间–>搜索用户的行为
function(json) {
assert.ok(json.ok)
headers[foo] = {
'x - lifestream - token ': json.token
};
get(....);
...
}
这写法+排版不复制到sublime鬼看的懂啊
@zuokanmingyuli 听我慢慢分解: 这是handle函数的原本样子,格式重排过: 如果我们不考虑error情况,代码应该是这样: 如果我们不考虑debug,和assert的东西,代码应该是这样: 现在看来这函数还是有点麻烦,这时候我们考察这个函数的使用场景,以下是我构想的一个场景: 其实callback0等价于: 到这里,callback0的语义非常明朗,他是一个回调函数,负责将body这个json数据解析成js 的数组,然后“杀死比尔” 反过去推简版的handle的语义:handle是一个返回一个回调函数的函数,其参数即回调函数的后续操作,其返回函数负责将json数据解析成js 的数组,然后传给后续操作。 最后加上我们刚才注释到的if和debug语句,得到handle的最终语义: handle是一个返回一个回调函数的函数,其参数即回调函数的后续操作,其所返回的回调函数负责1)检查返回数据是否合法同时做断言;2)将body 这个json数据解析成js 的数组,然后传给后续操作。 请叫我雷锋
@lixinqi 好感动!终于看懂了,非常感谢!开始那个return function (error, response, body)没看懂,后来也看出来是nodejs的request模块的用法。感觉这种写法是比较专业的是吗?看懂了,但问题还是没解决。问题不在这段代码,在于之前的mongodb根本就没连接上。于是我又去看之前的代码,是用于连接mongodb和设计mongodbAPI的代码,要不行还得求助啊,再次感谢!