如果执行异步操作,将产生表达式块
Will yield expression block if execute asynchronous operation?
我已经了解到,当我们调用next()
时,代码将继续运行,直到yield关键字,并且next()
返回将保持此值。我的问题是,如果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的请求还没有完成,yahoo.com的请求会立即发送吗?或者它必须阻止并等待谷歌的请求完成?
如果您使用的方法"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();
});
然而,仍然可以忽略回调并使yield立即返回。
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)
});
}
}
相关文章:
- 是否存在将String转换为可执行的c++表达式的方法
- 为什么这个正则表达式需要这么长时间才能执行
- 突出显示与perl正则表达式匹配的HTML部分 - 在服务器端perl或客户端javascript中执行此操作
- 如何将变量表达式转换为可执行代码(而不是替换值)
- JavaScript:返回表达式后的语句将被执行
- 正则表达式回调函数只执行一次
- 如何在执行之前使 JavaScript 中的内联表达式等待
- 在视图模板中执行角度表达式会降低角度应用的性能
- 有没有办法生成一个可以通过 if 直接执行的条件表达式
- Chrome 在执行正则表达式匹配时崩溃
- 如何在 Javascript 中执行此正则表达式
- 是否可以传递立即调用的函数表达式的执行上下文
- 在 IE 上,表达式执行两次
- 我该如何在JavaScript数组中执行正则表达式查找uof值
- jQuery:如果内容与正则表达式模式匹配,则执行此功能
- Angular.js+PHP:如果在ngSanitized html模板内,则不执行Angular表达式
- 如果执行异步操作,将产生表达式块
- 未在 Sequelize catch 处理程序中执行的表达式响应
- 为什么这个正则表达式执行缓慢
- 对Angular表达式执行regex