![](/img/trans.png)
[英]Why does this function return undefined but console.logs the correct answer?
[英]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?');
承诺p
的执行者在调用过程中同步解析承诺,其值应为“应该优先”。
resp
设置为通过在p
上调用then
返回的promise。 请注意,提供给promise的onFulfilled函数永远不会在提供它的同一线程中执行。 如果承诺已经解决,则在当前线程完成执行后,将在其自己的线程中调度回调。
it
被设置为发电机功能的迭代器。 代码仍然从顶部开始同步执行。
it.next()
被调用并返回承诺对象resp
(其变为未使用的)。
再次调用it.next()
,并在生成器函数中将其作为yield的返回值显示为“应该第二秒”,并将其记录到控制台中。
发布的代码线程完成执行。 承诺p
的onFulfilled侦听器计划在即将执行时执行,日志在执行should go first
。
当前从p
的已实现侦听器返回some value
,因此将用于填充通过调用创建的下一个链接的诺言。 then
resp
。 如果要将其传递给生成器函数,请将it.next('some value')
return 'some value'
替换为它it.next('some value')
。
最重要的是,在通过then / .catch调用提供的onFulfilled
或onRejected
函数的任何异步处理开始发生之前,将在单个同步代码中定义的所有promise对象全部完整地创建,并具有回调链接。 即使在承诺定义期间(同步)解决了承诺,也是如此。
- 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.