【发布时间】:2025-12-08 08:50:01
【问题描述】:
在阅读(强烈推荐)系列丛书You Don't Know JS 时,我阅读了this 部分:
function foo(x,y,cb) {
ajax(
"http://some.url.1/?x=" + x + "&y=" + y,
cb
);
}
foo( 11, 31, function(err,text) {
if (err) {
console.error( err );
}
else {
console.log( text );
}
} );
如您所见,foo 函数的调用完全由 wiki definition 异步:
异步,在计算机编程中,是指独立于主程序流程的事件的发生以及处理此类事件的方式。这些可能是“外部”事件,例如信号的到来,或由程序发起的与程序执行同时发生的动作,程序不会阻塞以等待结果 .
作者使用generators重新实现了上面的代码来演示当我们要执行异步函数时如何使用generators:
function foo(x,y) {
ajax(
"http://some.url.1/?x=" + x + "&y=" + y,
function(err,data){
if (err) {
// throw an error into `*main()`
it.throw( err );
}
else {
// resume `*main()` with received `data`
it.next( data );
}
}
);
}
function *main() {
try {
var text = yield foo( 11, 31 );
console.log( text );
}
catch (err) {
console.error( err );
}
}
var it = main();
// start it all up!
it.next();
通过调用it.next(),我们执行main直到第一个yield,然后等到迭代器it将恢复main的执行。根据异步的定义,下面这段代码的调用不是异步的:
function *main() {
try {
var text = yield foo( 11, 31 );
console.log( text );
}
catch (err) {
console.error( err );
}
}
还有:
var it = main();
// start it all up!
it.next();
我的任何结论都不正确吗?
【问题讨论】:
-
那个代码不好
-
我可以看到一个优势:这是最简洁的代码,可以将回调结果提取回调用者,而无需注册更多事件以使用该结果。
-
@Isaac After reading that chapter,我可以说这段代码非常强大,是实现
async和await的第一步。我鼓励您阅读本章,以更好地了解这段代码如何演变为更加坚实和强大的东西。 -
你正在使用一个全局变量
it,这违背了试图解开你的代码的目的 -
我也这么认为。但后来他慢慢地(一步一步地)将这段代码升级到更好的代码。
标签: javascript asynchronous generator