本虾米又被虐了,这段程序看不懂,我想知道我该学什么,查什么?谢谢!
发布于 10 年前 作者 zuokanmingyuli 5770 次浏览 最后一次编辑是 8 年前 来自 问答

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

} }

21 回复

这个 handle(cb)函数究竟是个啥意思?而且不知为何,运行时不报错,但测试时间超时。。

这排版……

整理下排版,这排版都没人愿意看

;})  // 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鬼看的懂啊

楼主大大,先用十分钟小看一下markdown不好么… 汗

@zuokanmingyuli 听我慢慢分解: 这是handle函数的原本样子,格式重排过: a.png 如果我们不考虑error情况,代码应该是这样: b.png 如果我们不考虑debug,和assert的东西,代码应该是这样: c.png 现在看来这函数还是有点麻烦,这时候我们考察这个函数的使用场景,以下是我构想的一个场景: d.png 其实callback0等价于: e.png 到这里,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的代码,要不行还得求助啊,再次感谢!

@ierask 大侠好眼力,感谢感谢!

@zuokanmingyuli 我比较通各种高阶函数的写法,以后有麻烦不妨找我,我的qq823435180

@lixinqi 用的什么编辑器?看着挺漂亮的,呵呵

@chapgaga 哈哈,只是目前开发用PHP。我不挑语言,市面上的基本都会点,小众语言也会一点。

@chapgaga 不是转,是都会点。不会在意具体语言:-)

@lixinqi 感谢!!大牛啊

回到顶部