当在javascript中产生promise时会发生什么
What happens when promise is yielded in javascript?
未找到完整答案。。
当承诺兑现时会发生什么?
这样的建筑是吗
var p = new Promise()
p.resolve(value)
function * (){
yield p
}
相当于
function * (){
yield value
}
更新
如何混合不同风格的异步编程,例如对于像koa这样的框架?
Koa中间件使用生成器,但有很多好的包是基于promise的(例如sequelize)
正如Felix所说,承诺只是要产生的另一个价值。
然而,有一种编写异步代码的风格,它以特定的方式使用已产生的promise。这涉及到一段周围的代码,该代码调用生成器,然后等待生成的promise得到解析,然后才向生成器请求下一个值。这允许您将程序编写为:
function goGenerator *() {
var userData = yield getUserData();
yield checkuserData(userData);
}
其中getUserData
和checkUserData
都返回一个promise。这比必须写要干净一点
function goPromises() {
return getUserData() . then(checkUserData);
}
尤其是在涉及更多承诺的情况下。这种基于生成器的样式按顺序读取,让人想起异步函数方法。
async function goAsyncFunction() {
var userData = await getUserData();
return await checkUserData(userData);
}
但是异步函数还没有得到广泛支持。基于生成器的方法是使用纯ES6的替代方法。
正如我所提到的,基于生成器的方法需要一段"围绕"它的代码,它知道如何处理所产生的承诺——正如我所说,这是在再次调用生成器之前等待它们解决。这方面的经典实现是co
——你可以用谷歌搜索它。或者你可以自己写:
function spawn(generator) {
var iterator = generator();
return new Promise(
resolve =>
function iterate(val) {
var {value, done} = iterator.next(val);
if (done) { resolve(val); }
else { Promise.resolve(value).then(iterate); }
}()
);
}
现在运行spawn(goGenerator)
。spawn
本身返回一个promise,所以您可以挂起它的更多内容:spawn(goGenerator) . then(doMoreStuff)
。
这是一个非常简单的实现。co
还有更多的功能——例如,您可以yield
一个promise数组,它将等待所有这些promise都得到解决,即一个la Promise.all
。
当承诺兑现时会发生什么?
没什么特别的。承诺只是一个对象。生成器将产生该承诺,您可以订阅它:
var promise = generator().next().value;
promise.then(...);
- 什么是“;Promise在事件循环的同一个循环上点火“;意思是
- redux thunk和redux promise之间的区别是什么
- 在jQuery中返回promise()或deferred有什么区别
- 在 Promise 调用的错误函数回调后附加对象的用法是什么
- 当您不再持有对 ES6-Promise 的引用时会发生什么情况
- 返回值和 Promise.resolve 从 then() 有什么区别
- 在循环中使用 q promise 的最佳方法是什么?等待链完成,然后再迭代到下一个
- 使用带有promise而不是thunks的co-library有什么好处
- 什么'我的javascript promise代码有问题
- 在ES6 Promise中允许多次解析/拒绝的原因是什么
- 当在javascript中产生promise时会发生什么
- 当你想要所有结果而不管是否被拒绝时,用什么代替Promise.all()
- 什么'这是处理promise对象中错误结果的正确方法
- 使用 ES6 的 Promise.all() 时限制并发性的最佳方法是什么?
- 在Promise中,使用catch和它的第二个参数有什么区别?
- jQuery递归的Promise函数有什么问题?
- 在promise . all中实现长承诺链的最佳实践是什么?
- 如果promise在此之前完成,会发生什么?
- Q.all()和Promise.prototype.all()方法的区别是什么?
- 如果我用另一个Promise值拒绝一个Promise会发生什么?