为什么thunkify/yield总是返回一个数组?

mik*_*ana 1 javascript yield thunk node.js co

我有一个thunk名为logInline(改编自Co文档).

我注意到thunkified get总是似乎是yield一个数组.这是设计的吗?它是这样thunkify做的,还是标准的一部分yield

var co = require('co'),
  get = thunkify(request.get);

var logInline = co(function *(){
  var google = yield get('http://google.com'); 
  console.log(google[0].statusCode);
})

logInline()
Run Code Online (Sandbox Code Playgroud)

请注意,此处的变量'google'始终是一个数组.为什么?请注意,request.get通常返回err, response(即没有数组).

脚本BTW返回200google.com返回的任何其他响应代码.

产量文件是相当稀疏ATM.

编辑: Thunk并不总是返回数组.例如,如果var readFile = thunkify(fs.readFile);:

var fileContents = yield readFile('myfile', 'utf8');
log(fileContents);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,fileContents不会在数组中返回.那么为什么谷歌在一个阵列里? 在thunkify中似乎有一些东西可以控制thunk返回的内容

Ber*_*rgi 5

我注意到thunkified get似乎总是产生一个数组.这是设计的吗?

我不知道也无法证实,正如你所说的那样(co,yield这里没有兴趣)的文档非常稀少.

然而,我可以想象它yield确实会导致回调的arguments-array,以便轻松支持多个返回值.您可以使用解构分配来获取单个结果:

co(function *(){
  var [google] = yield get('http://google.com'); 
  console.log(google.statusCode);
})
Run Code Online (Sandbox Code Playgroud)

编辑:

在thunkify中似乎有一些东西可以控制thunk返回的内容

实际上,这有时只会发生.我现在检查读取的代码

if (arguments.length > 2) res = slice.call(arguments, 1);
Run Code Online (Sandbox Code Playgroud)

因此,如果使用多个结果参数(忽略错误参数)调用回调函数(thunkified调用,但想象它是传递给fs.readFilerequest.get直接调用的函数),那么将为yield您的生成器编写一个数组码.

  • 谢谢你,它看起来像解构分配仍然是在ATM节点的方式(http://stackoverflow.com/questions/17379277/destructuring-in-node-js),所以我现在做`VAR谷歌=(收益率的get('HTTP ://google.com'))[0];` (2认同)