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)
        });
    }
}