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。
p
的执行者在调用过程中使用值“should go first”同步解析承诺resp
设置为调用then
在p
上。注意,提供给承诺的oncompleted函数永远不会在提供它的同一线程中执行。如果承诺已被解析,则回调将在当前线程完成执行后在其自己的线程中调度将其设置为生成器函数的迭代器。代码仍在从顶部同步执行
it.next()
,并返回promise对象resp
(未使用)it.next()
,并在生成器函数中显示为yield的返回值“should go second”,将其记录到控制台p
的OnCompleted侦听器计划在即将到来的执行中执行,日志在执行时应首先执行
一些值当前从p
的onCompleted侦听器返回,因此将用于填充通过调用创建的下一个链式承诺。然后上的resp
。如果要将其传递给生成器函数,请用it.next('some value')
替换return'some value'
结论
底线是,在通过then/.catch调用提供的onCompleted
或onRejected
函数的任何异步处理开始之前,在一段同步代码中定义的所有promises对象都被完整地创建,并具有回调链接。即使承诺在其定义过程中(同步)得到解决,这也是正确的。问题1。
promisep
的执行者在调用过程中使用值“should go first”同步解析承诺
resp
设置为调用then
在p
上。注意,提供给承诺的oncompleted函数永远不会在提供它的同一线程中执行。如果承诺已被解析,则回调将在当前线程完成执行后在其自己的线程中调度
将其设置为生成器函数的迭代器。代码仍在从顶部同步执行
调用it.next()
,并返回promise对象resp
(未使用)
再次调用it.next()
,并在生成器函数中显示为yield的返回值“should go second”,将其记录到控制台
发布的代码线程完成执行。promisep
的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