2014-04-11 3 views
1

logInline (Co documentation에서 변경)이라고하는 thunk이 있습니다.왜 thunkify/yield는 항상 배열을 반환합니까?

나는 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입니다.

편집 : 썽크가 항상 배열을 반환하지는 않습니다. 예 : var readFile = thunkify(fs.readFile); :

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

이 경우 fileContents는 배열 내에 반환되지 않습니다. 그렇다면 왜 배열 내부에 Google이 있었습니까? 는 썽크 항상 배열을 얻을 것으로 보인다 내가 얻을 thunkified 알

+1

'yield'와 'thunkify'를 볼 시간이 없었기 때문에 추측 일 뿐이지 만 'when'과 'node.lift'와 비슷한 동작이 있습니다. ('err' 옆에) 하나 이상의 인수를 가질 수있는 콜백 메소드는 항상 배열이며, 여기서 a [0]은 첫 번째 인수이고, a [1]은 두 번째 인수이며, ... –

답변

5

을 반환 할 것을 thunkify 제어에 뭔가가있는 것 같습니다. 디자인에 의한 것인가? 나도 몰라하고 문서를 말한대로, 확인할 수없는

(공동의는 yield 여기에 관심없는) 매우 드물다.

그러나 yield은 콜백의 arguments-array 결과로 여러 개의 반환 값을 쉽게 지원할 수 있습니다. 당신은 다시 하나의 결과를 얻기 위해 destructuring 할당을 사용할 수 있습니다 :

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

편집 : thunkify 썽크가

실제로 반환 무엇 제어에 뭔가가있는 것 같습니다

, 이것은 때로는 발생합니다. 지금은 콜백 함수 하나 개 이상의 결과 인수 (호출한다 (그러나 thunkified 호출이 직접 fs.readFile 또는 request.get에 전달되는 하나가 상상) 경우

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

그래서 읽는, the code을 확인 오류 매개 변수는 무시됩니다) 배열은 생성자 코드에 yield이됩니다.

+2

Node ATM (http://stackoverflow.com/questions/17379277/destructuring-in-node-js)에서 구조화 할당이 진행중인 것처럼 보이므로 현재 'var google = (yield get (' http://google.com ')) [0];' – mikemaccana

+0

아, 나는 그들이 일하기를 기대 했었습니다 ... FF는 오랫동안 그들을지지합니다 : - / – Bergi