繁体   English   中英

为什么Generator中的console.logs会以这种顺序出现?

[英]Why console.logs in generator appears in such order?

有了下面的代码,我想问两个问题(主要和次要):
1.在生成器函数的console.log(second)之前产生promise p ,那么为什么从给定的promise中在console.log (second)之前记录console.log(second)
2.我看到某个地方(在koa框架中完成)在代码中使用了返回值(请参阅return'some value' )(将响应发送回客户端)...我该如何在我的控制台中进行控制台。功能? 可能吗?

var p = new Promise((resolve) => {
    resolve('should go first?');
})

var resp = p.then((first) => {
    console.log(first);
    return 'some value'; //pertain to the secondary question
})


function* gen(prom){
    var second = yield prom;
    console.log(second);
}

var it = gen(resp);

it.next();
it.next('should go second?');

问题1

  1. 承诺p的执行者在调用过程中同步解析承诺,其值应为“应该优先”。

  2. resp设置为通过在p上调用then返回的promise。 请注意,提供给promise的onFulfilled函数永远不会在提供它的同一线程中执行。 如果承诺已经解决,则在当前线程完成执行后,将在其自己的线程中调度回调。

  3. it被设置为发电机功能的迭代器。 代码仍然从顶部开始同步执行。

  4. it.next()被调用并返回承诺对象resp (其变为未使用的)。

  5. 再次调用it.next() ,并在生成器函数中将其作为yield的返回值显示为“应该第二秒”,并将其记录到控制台中。

  6. 发布的代码线程完成执行。 承诺p的onFulfilled侦听器计划在即将执行时执行,日志在执行should go first

问题2。

当前从p的已实现侦听器返回some value ,因此将用于填充通过调用创建的下一个链接的诺言。 then resp 如果要将其传递给生成器函数,请将it.next('some value') return 'some value'替换为它it.next('some value')

结论

最重要的是,在通过then / .catch调用提供的onFulfilledonRejected函数的任何异步处理开始发生之前,将在单个同步代码中定义的所有promise对象全部完整地创建,并具有回调链接。 即使在承诺定义期间(同步)解决了承诺,也是如此。

  1. promise p在生成器函数中的console.log(second)之前产生,那么为什么从给定的promise中,console.log(second)在console.log之前记录?

您产生的结果是promise对象,如果您检查它的值,就会看到状态为pending

..如何在我的gen函数中进行console.log? 可能吗?

then方法中,您可以记录它

 var p = new Promise((resolve) => { resolve('should go first?'); }) var resp = p.then((first) => { console.log(first); return 'some value'; //pertain to the secondary question }) function* gen(prom){ var second = yield prom; console.log(second); prom.then((x)=> { console.log(x); }); } var it = gen(resp); var first = it.next().value; console.log(first); it.next('should go second?'); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM