Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么生成器中的console.logs以这样的顺序出现?_Javascript_Node.js_Asynchronous_Promise_Generator - Fatal编程技术网

Javascript 为什么生成器中的console.logs以这样的顺序出现?

Javascript 为什么生成器中的console.logs以这样的顺序出现?,javascript,node.js,asynchronous,promise,generator,Javascript,Node.js,Asynchronous,Promise,Generator,有了下面的代码,我想问两个问题(主要问题和次要问题): 1.在生成器函数中,promise p是在console.log(秒)之前生成的,那么为什么console.log(秒)是在console.log之前从给定的promise中生成的呢? 2.我看到了一些(在膝关节炎框架中完成的),返回值(参见返回值),在代码中使用(响应返回到客户端发送)…如何在gen函数中记录console.log?有可能吗 var p = new Promise((resolve) => { resolve

有了下面的代码,我想问两个问题(主要问题和次要问题):
1.在生成器函数中,promise p是在console.log(秒)之前生成的,那么为什么console.log(秒)是在console.log之前从给定的promise中生成的呢?
2.我看到了一些(在膝关节炎框架中完成的),返回值(参见返回值),在代码中使用(响应返回到客户端发送)…如何在gen函数中记录console.log?有可能吗

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。
  • promise
    p
    的执行者在调用过程中使用值“should go first”同步解析承诺

  • resp
    设置为调用
    then
    p
    上。注意,提供给承诺的oncompleted函数永远不会在提供它的同一线程中执行。如果承诺已被解析,则回调将在当前线程完成执行后在其自己的线程中调度

  • 将其设置为生成器函数的迭代器。代码仍在从顶部同步执行

  • 调用
    it.next()
    ,并返回promise对象
    resp
    (未使用)

  • 再次调用
    it.next()
    ,并在生成器函数中显示为yield的返回值“should go second”,将其记录到控制台

  • 发布的代码线程完成执行。promise
    p
    的OnCompleted侦听器计划在即将到来的执行中执行,日志
    在执行时应首先执行

  • 问题2。
    一些值当前从
    p
    的onCompleted侦听器返回,因此将用于填充通过调用创建的下一个链式承诺。
    然后
    上的
    resp
    。如果要将其传递给生成器函数,请用
    it.next('some value')
    替换
    return'some value'

    结论 底线是,在通过then/.catch调用提供的
    onCompleted
    onRejected
    函数的任何异步处理开始之前,在一段同步代码中定义的所有promises对象都被完整地创建,并具有回调链接。即使承诺在其定义过程中(同步)得到解决,这也是正确的。

    问题1。
  • promise
    p
    的执行者在调用过程中使用值“should go first”同步解析承诺

  • resp
    设置为调用
    then
    p
    上。注意,提供给承诺的oncompleted函数永远不会在提供它的同一线程中执行。如果承诺已被解析,则回调将在当前线程完成执行后在其自己的线程中调度

  • 将其设置为生成器函数的迭代器。代码仍在从顶部同步执行

  • 调用
    it.next()
    ,并返回promise对象
    resp
    (未使用)

  • 再次调用
    it.next()
    ,并在生成器函数中显示为yield的返回值“should go second”,将其记录到控制台

  • 发布的代码线程完成执行。promise
    p
    的OnCompleted侦听器计划在即将到来的执行中执行,日志
    在执行时应首先执行

  • 问题2。
    一些值当前从
    p
    的onCompleted侦听器返回,因此将用于填充通过调用创建的下一个链式承诺。
    然后
    上的
    resp
    。如果要将其传递给生成器函数,请用
    it.next('some value')
    替换
    return'some value'

    结论 底线是,在通过then/.catch调用提供的
    onCompleted
    onRejected
    函数的任何异步处理开始之前,在一段同步代码中定义的所有promises对象都被完整地创建,并具有回调链接。即使承诺在定义期间(同步)得到解决,这也是正确的

  • 在生成器函数中,promise p是在console.log(秒)之前生成的,那么为什么console.log(秒)是在console.log之前从给定的promise中生成的呢
  • 您得到的是promise对象,如果您检查它的值,您将看到状态为
    pending

    ..我如何在gen函数中记录console.log?有可能吗

    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?');
    
    方法中,您可以记录它

    var p=新承诺((解决)=>{
    决心(‘应该先走?’);
    })
    var resp=p.then((首先)=>{
    console.log(第一);
    返回'some value';//与第二个问题有关
    })
    功能*gen(可编程只读存储器){
    var第二=收益率;
    console.log(第二个);
    然后((x)=>{
    控制台日志(x);
    });
    }
    var it=发电机(分别);
    var first=it.next().value;
    console.log(第一);
    它。下一个('应该是第二个?')
    
  • 在生成器函数中,promise p是在console.log(秒)之前生成的,那么为什么console.log(秒)是在console.log之前从给定的promise中生成的呢
  • 您得到的是promise对象,如果您检查它的值,您将看到状态为
    pending

    ..我如何在gen函数中记录console.log?有可能吗

    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?');
    
    方法中,您可以记录它

    var p=新承诺((解决)=>{
    决心(‘应该先走?’);
    })
    var resp=p.then((首先)=>{
    console.log(第一);
    返回'some value';//与第二个问题有关
    })
    功能*gen(可编程只读存储器){
    var第二=收益率;
    console.log(第二个);
    然后((x)=>{
    控制台日志(x);
    });
    }
    var it=发电机(分别);
    var first=it.next