有了下面的代码,我想问两个问题(主要和次要):
1. promise p 在生成器函数中的 console.log(second)之前产生,所以为什么在控制台之前记录 console.log(second)。记录下来的承诺?
2.我在某处(在koa框架中完成)看到了返回值(参见 return'某些值' )在代码中使用(随响应一起发送回客户端)。 ..我怎么能在我的gen函数中调试它?它甚至可能吗?
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?');
答案 0 :(得分:2)
承诺p
的执行者在调用期间同步解决承诺"应先行"。
resp
设置为通过调用then
返回的承诺
在p
。请注意,提供给promise的onFulfilled函数永远不会在提供它的同一个线程中执行。如果promise已经解决,则在当前线程完成执行后,将在其自己的线程中调度回调。
it
被设置为生成器函数的迭代器。代码仍然从顶部同步执行。
it.next()
并返回promise对象resp
(未使用)。
it.next()
;应该是第二个"在生成器函数中显示为yield的返回值,将其记录到控制台。
发布的代码线程完成执行。承诺p
的onFulfilled监听器计划在即将执行时执行,并在执行时记录should go first
。
some value
目前从p
的onfulfilled侦听器返回,因此将用于填充下一个链式承诺,该承诺是通过then
调用resp
创建的。 }。如果要将其传递给生成器函数,请将return 'some value'
替换为it.next('some value')
。
最重要的是,在 onFulfilled
的任何异步处理之前,在单个同步代码中定义的所有promises对象都是完整的,并且回调链接就位。通过then / .catch调用提供的onRejected
函数开始发生。即使在定义期间(同步)解决了promises,也是如此。
答案 1 :(得分:1)
如果你检查了它的价值,你会看到状态是
- promise p在生成器函数中的console.log(second)之前产生,那么为什么console.log(second)在来自给定promise的console.log之前记录?
醇>
pending
..我怎么能在我的gen函数中调试它?它甚至可能吗?
在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?');