Javascript 如果执行异步操作,将产生表达式块吗?
我了解到,当我们调用Javascript 如果执行异步操作,将产生表达式块吗?,javascript,generator,yield,Javascript,Generator,Yield,我了解到,当我们调用next()时,代码将继续运行,直到yield关键字出现,而next()return将保留此值。我的问题是,如果yield表达式正在执行异步操作,例如执行文件io或http请求,并且在异步调用完成之前,我们调用next,那么即使异步操作尚未完成,代码是否仍将阻塞,或者立即恢复运行?为什么 function * generator(){ yield http.get('http://google.com'); yield http.get('http://yahoo.c
next()
时,代码将继续运行,直到yield关键字出现,而next()
return将保留此值。我的问题是,如果yield表达式正在执行异步操作,例如执行文件io或http请求,并且在异步调用完成之前,我们调用next
,那么即使异步操作尚未完成,代码是否仍将阻塞,或者立即恢复运行?为什么
function * generator(){
yield http.get('http://google.com');
yield http.get('http://yahoo.com');
}
var gen = generator();
var a = gen.next();
var b = gen.next();
如果google.com的请求尚未完成,雅虎会立即发送请求吗?或者它必须阻塞并等待google的请求完成?如果您使用的“get”方法是任意循环的,它将立即返回(非阻塞)。这意味着,即使google.com尚未完成,yahoo.com的请求也将被发送。您发布的代码不会等待每个
http.get
请求执行。但是,可以通过改变发电机的使用方式来实现这一点
以下代码显示了如何使用回调和生成器实现异步睡眠函数:
function wait(ms) {
return function (cb) {
setTimeout(cb, ms);
};
}
function * generator(startTime) {
console.log('start ' + (Date.now() - startTime));
yield wait(1000);
console.log('stop ' + (Date.now() - startTime));
}
console.log("Using generator asynchronously")
var gen2 = generator(Date.now());
gen2.next().value(function () {
gen2.next();
});
然而,仍然可以忽略回调并立即返回收益率
console.log("Using generator synchronously")
var gen1 = generator(Date.now());
gen1.next();
gen1.next();
对于您发布的代码,最好使用http.get
返回一个Promise
。在这种情况下,您可以使用类似于以下内容的代码:
function * generator(){
var google = yield http.get('http://google.com');
var yahoo = yield http.get('http://yahoo.com');
}
var gen = generator();
loop(gen);
function loop(gen, next) {
var result = gen.next(next);
if (!result.done) {
result.value.then(function (value) {
loop(gen, value)
});
}
}