有了下面的代码,我想问两个问题(主要问题和次要问题):
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?');发布于 2016-05-16 09:32:49
您正在产生的是承诺对象,如果您检查它的值,您将看到状态是pending
..How,我能用我的基因函数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?');
发布于 2016-05-15 22:33:08
问题1.
p的执行器在调用时以“应先执行”的方式同步解析承诺。resp设置为调用p上的then返回的承诺。注意,提供给允诺的onFulfilled函数从未在提供它的同一个线程中执行。如果承诺已经解决,回调将在当前线程完成执行后在自己的线程中调度。it被设置为生成器函数的迭代器。代码仍在从顶部同步执行。it.next()被调用并返回承诺对象resp (未使用)。it.next(),并将其作为生成器函数中的收益率的返回值来表示,后者将其记录到控制台。p侦听器被安排在即将执行的时候,并在执行时记录should go first。问题2.
some value当前从p的已完成的侦听器返回,因此将用于填充通过调用.then on resp创建的下一个链接承诺。如果要将其传递给生成器函数,请将return 'some value'替换为it.next('some value')。
结论
底线是,所有在一段同步代码中定义的对象都是完整地创建的,在通过/..catch调用提供的onFulfilled或onRejected函数的任何异步处理开始之前,都会建立回叫链接。即使承诺在定义期间(同步地)被解决,这也是正确的。
https://stackoverflow.com/questions/37243894
复制相似问题