在javascript中产生承诺会发生什么?

aka*_*Rem 5 javascript yield promise koa

没找到完整的答案..

承诺产生后会发生什么?

就是这样的建筑

var p = new Promise()
p.resolve(value)

function * (){
  yield p
}
Run Code Online (Sandbox Code Playgroud)

相当于

function * (){
  yield value
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

如何混合不同风格的异步编程,例如像koa这样的框架?

Koa中间件正在使用生成器,但是有很多好的包是基于promise的(例如,sequelize)

Fel*_*ing 6

承诺产生后会发生什么?

没什么特别的.承诺只是一个对象.生成器将产生该承诺,您可以订阅它:

var promise = generator().next().value;
promise.then(...);
Run Code Online (Sandbox Code Playgroud)


小智 5

正如菲利克斯所说,承诺只是另一个值得屈服的价值.

但是,有一种编写异步代码的方式,它以特定的方式使用产生的promise.这涉及调用生成器的周围代码,然后等待所产生的承诺解析,然后然后才向生成器请求下一个值.这允许您将程序编写为:

function goGenerator *() {
  var userData = yield getUserData();
  yield checkuserData(userData);
}
Run Code Online (Sandbox Code Playgroud)

如果双方getUserDatacheckUserData返回一个承诺.这比写作要简单一些

function goPromises() {
  return getUserData() . then(checkUserData);
}
Run Code Online (Sandbox Code Playgroud)

特别是如果有更多的承诺.这种基于生成器的样式按顺序读取,并且让人联想到异步函数方法.

async function goAsyncFunction() {
  var userData = await getUserData();
  return await checkUserData(userData);
}
Run Code Online (Sandbox Code Playgroud)

但异步功能尚未得到广泛支持.基于发电机的方法是一种可与纯ES6配合使用的方法.

正如我所提到的,基于生成器的方法需要一段代码"围绕"它,知道如何处理所产生的承诺 - 正如我所说的那样,在再次调用生成器之前等待它们解决.这个经典的实现是 - co你可以Google.或者你可以写自己的:

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); }
      }() 
  );

} 
Run Code Online (Sandbox Code Playgroud)

现在你跑spawn(goGenerator).spawn本身会返回一个承诺,所以你可以挂掉更多东西:spawn(goGenerator) . then(doMoreStuff).

这是一个非常简单的实现.co还有更多的功能-例如,你可以yield承诺的阵列,它会等待所有的人来解决,一拉Promise.all.