为什么生成器中的console.logs按此顺序出现?

时间:2016-05-15 21:33:51

标签: javascript node.js asynchronous promise generator

有了下面的代码,我想问两个问题(主要和次要):
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?');

2 个答案:

答案 0 :(得分:2)

问题1。

  1. 承诺p的执行者在调用期间同步解决承诺"应先行"。

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

  3. it被设置为生成器函数的迭代器。代码仍然从顶部同步执行。

  4. 调用
  5. it.next()并返回promise对象resp(未使用)。

  6. 使用&#34再次调用
  7. it.next();应该是第二个"在生成器函数中显示为yield的返回值,将其记录到控制台。

  8. 发布的代码线程完成执行。承诺p的onFulfilled监听器计划在即将执行时执行,并在执行时记录should go first

  9. 问题2。

    some value目前从p的onfulfilled侦听器返回,因此将用于填充下一个链式承诺,该承诺是通过then调用resp创建的。 }。如果要将其传递给生成器函数,请将return 'some value'替换为it.next('some value')

    结论

    最重要的是,在 onFulfilled的任何异步处理之前,在单个同步代码中定义的所有promises对象都是完整的,并且回调链接就位。通过then / .catch调用提供的onRejected函数开始发生。即使在定义期间(同步)解决了promises,也是如此。

答案 1 :(得分:1)

  
      
  1. promise p在生成器函数中的console.log(second)之前产生,那么为什么console.log(second)在来自给定promise的console.log之前记录?
  2.   
如果你检查了它的价值,你会看到状态是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?');