据我了解,ECMA6生成器应该能够屈服于一个返回promise的函数,最终返回已解决/拒绝的函数.使代码读取更像同步代码,并避免回调地狱.
我正在使用带有--harmony的node.js v0.12.2和以下代码.
var someAsyncThing = function() {
return new Promise(function(resolve, reject) {
resolve("I'm Resolved!");
});
};
someAsyncThing().then(function(res) {console.log(res);});
// Works as expected: logs I'm Resolved!
function* getPromise() {
var x = yield someAsyncThing();
console.log("x: " + x); // Fails x undefined
}
var y = getPromise();
console.log(y); // returns {}
console.log(y.next());
// Fails: logs { value: {}, done: false }
Run Code Online (Sandbox Code Playgroud)
我的代码基于我能够在网上找到的几个例子.我究竟做错了什么?
我已经阅读了几个使用JavaScript生成器的代码示例,例如这个.我能想到的最简单的生成器使用块是这样的:
function read(path) {
return function (done) {
fs.readFile(path, "file", done);
}
}
co(function *() {
console.log( yield read("file") );
})();
Run Code Online (Sandbox Code Playgroud)
这确实打印出了内容file,但我的挂断是在哪里done调用.看起来,yield是一个语法糖,用于包装它在回调中返回的内容并适当地分配结果值(至少在co将错误参数抛给回调的情况下).我对语法的理解是否正确?
使用done时看起来像什么yield?
没找到完整的答案..
承诺产生后会发生什么?
就是这样的建筑
var p = new Promise()
p.resolve(value)
function * (){
yield p
}
Run Code Online (Sandbox Code Playgroud)
相当于
function * (){
yield value
}
Run Code Online (Sandbox Code Playgroud)
?
UPDATE
如何混合不同风格的异步编程,例如像koa这样的框架?
Koa中间件正在使用生成器,但是有很多好的包是基于promise的(例如,sequelize)