看似,產率是用於包裹它返回到一個回調和適當地分配的結果值(至少在共同的情況下,引發錯誤參數回調)
語法糖
不,yield
不是語法糖。它是生成器的核心語法元素。當這個生成器被實例化時,你可以運行它(通過調用.next()
),這將返回return
ed或yield
ed的值。當發電機爲yield
時,您可以稍後再次撥打.next()
繼續。 next
的參數將是yield
表達式在生成器內返回的值。
只有在co
情況下,這些異步回調的事情(和other things)是什麼,你會考慮自然的異步控制流圖書館「適當」處理。
使用良率時的做法是什麼?
從article that you read的thread
功能例子給你一個很好的印象:
function thread(fn) {
var gen = fn();
function next(err, res) {
var ret = gen.next(res);
if (ret.done) return;
ret.value(next);
}
next();
}
在你的代碼,yield
確實當它跑到離發生器產生表達read("file")
的價值。這成爲ret.val
,gen.next()
的結果。爲此,next
函數被傳遞 - 一個回調函數,它將繼續生成器並傳遞給它的res
ult。在您的生成器代碼中,看起來好像yield
表達式返回了此值。
的「展開」發生了什麼版本可以這樣寫:
function fn*() {
console.log(yield function (done) {
fs.readFile("filepath", "file", done);
});
}
var gen = fn();
var ret1 = gen.next();
var callasync = ret1.value;
callasync(function next(err, res) {
var ret2 = gen.next(res); // this now does log the value
ret2.done; // true now
});
你指的是'done'作爲內部'讀(路徑)'使用?我不認爲它與'yield'或者具體的發生器有什麼關係 - 它是'co'庫的一部分。 – voithos