【问题标题】:Why does thunkify / yield always return an array?为什么 thunkify / yield 总是返回一个数组?
【发布时间】:2014-05-25 18:03:15
【问题描述】:

我有一个名为 logInlinethunk(改编自 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(即没有数组)。

顺便说一句,脚本返回 200 或 google.com 返回的任何其他响应代码。

the yield documentation 的 ATM 机太少了。

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

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

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

【问题讨论】:

  • 这只是一个猜测,因为我没有时间查看yieldthunkify,但whennode.lift 也有类似的行为。由于被它包装的回调方法可能有(除了err)多个参数,结果总是一个数组,其中a[0]是第一个参数,a[1]是第二个参数, ...

标签: javascript node.js yield thunk co


【解决方案1】:

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

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

但是我可以想象yield 确实会导致回调的参数数组,以便轻松支持多个返回值。您可以使用解构赋值来获取单个结果:

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 的回调函数)(错误参数被忽略),然后一个数组将yielded 到您的生成器代码中。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-11-22
  • 2019-05-28
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多