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

时间:2014-04-11 14:11:12

标签: javascript node.js yield thunk co

我有thunk名为 logInline (改编自Co documentation)。

我注意到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()

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

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

Alas the yield documentation非常稀疏的ATM。

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

var fileContents = yield readFile('myfile', 'utf8');
log(fileContents);

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

1 个答案:

答案 0 :(得分:5)

  

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

我不知道也无法确认,正如你所说的那样(co,yield的文档在这里不感兴趣)是非常稀疏的。

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

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

编辑:

  

在thunkify中似乎有某些东西控制着thunk返回的内容

事实上,这种情况有时只会发生。我现在检查了the code,其中包含

if (arguments.length > 2) res = slice.call(arguments, 1);

所以如果使用多个结果参数(错误参数)调用回调函数(thunkified调用,但想象它是直接传递给fs.readFilerequest.get的函数)被忽略),然后一个数组将yield发送到您的生成器代码。