promise和generator结合
我的前两篇文章已经介绍过
- promise解决方案是 获取数据 和 用户获取数据操作 分离来解决的
- thunk函数通过执行函数 回调函数分离 并借用yield来进行数据回传而得到异步处理
现在介绍的是 单单使用promise的话 其实效果并不好 不断的then then then… 并不好看
那么promise和generator的结合是否能擦出一些火花呢?
其实基本的思想和 thunk利用generator一样,
首先promise操作库可以看成时 thunk执行函数, then函数可以看成thunk的回调函数 这样的话 利用 yield在 promise操作函数那里移除函数执行权, 然后跑到 then那里获取 数据,并把数据 回传给 promise操作函数那里----基本和thunk一个思想
这样的话 用户的所有自定义操作逻辑全部放入到generator 整体的代码 看起来就像 同步执行的一样
这样我们的编程重心就放在了generator函数上面 因为有了像co这些可以自动执行generator的库, 他们完成的就是通过 generator.next()函数 把yield左边的promise对象取回,then一下 然后把得到的异步数据 放入到yield左边的接收数据的变量中 这些都是可以自动完成的
废话不多说 直接上代码
//原生的异步api
function GET_data_from_server(link, callback) {
setTimeout(function() {
console.log(link, 'server data');
callback(null, 'server data');
}, 1000);
}
//封装成promise
function GET_data_from_server_promise_lib(link) {
var promise = new Promise(function(resolve, reject) {
//调用原生的函数--这个promise状态的确定是回调函数后才确定 而且会传递函数执行完后获取的参数
GET_data_from_server(link, function(err, data) {
if (err) {
reject(err);
} else {
//注意: 这里是获取数据
resolve(data);
}
});
});
return promise;
}
//用户的自定义操作逻辑全部放入generator函数中
var gen = function* (){
var data1 = yield GET_data_from_server_promise_lib('http:www1');
//用户的自定义操作逻辑
console.log('data: ', data1);
var data2 = yield GET_data_from_server_promise_lib('http:www2');
//用户的自定义操作逻辑
console.log('data: ', data2);
}
//promise的then的作用仅仅只是 把数据回传到yield
var g = gen();
g.next().value.then(function(data1) {
g.next(data1).value.then(function(data2) {
g.next(data2)
});
});
//自动运行的run
function run(fn) {
var g = fn();
function next(preData) {
g.next(preData).value.then(function(nowData) {
next(nowData);
});
}
next(null);
}
run(gen);
//或者用co执行
var co = require('co');
co(gen);