promise和generator结合
发布于 8 年前 作者 yongningfu 6152 次浏览 来自 分享

promise和generator结合

我的前两篇文章已经介绍过

  1. promise解决方案是 获取数据 和 用户获取数据操作 分离来解决的
  2. 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);
4 回复

很有帮助,谢谢分享。

来自酷炫的 CNodeMD

回到顶部