node 新手,请问怎么在一个函数里等 promise 执行了 resolve() 之后才返回呢

2017-02-09 17:58:54 +08:00
 zgoing
3027 次点击
所在节点    Node.js
13 条回复
scarlex
2017-02-09 18:00:06 +08:00
直接返回 promise
believeitcould
2017-02-09 18:07:59 +08:00
es7 async await
yiyizym
2017-02-09 18:11:23 +08:00
这不就是同步执行么?

还用什么 Promise ?
finian
2017-02-09 18:20:15 +08:00
callback, promise, rx, async/await 任君选择
owt5008137
2017-02-09 18:25:42 +08:00
好像只能回调,或者看下是否已支持 await
zgoing
2017-02-09 19:00:48 +08:00
@yiyizym
@finian
@owt5008137

正在练手 koa ,用了 npm 里一个 google translate 的包,它返回的就是一个 promise ,我想把这个 promise 的结果传给 koa 路由,然后就不知道了。。。
rogerchen
2017-02-09 19:12:26 +08:00
promise 不是有 then 么,把后续逻辑写在 then 里边不就好了, poorman's await 。
abramstyle
2017-02-09 19:27:22 +08:00
路由就是 async 的,或者如果是 koa 1 那么就是 generator ,都支持异步。

给你个例子吧:

比如这个 controller :

koa1:
```js
a: function() * {
const result = yield fetchTranslate();

this.data = result;
}
```

koa 2:

```js
async a(ctx, next) {
const result = await fetchTranslate();

ctx.data = result;
}
```

没测试,可能有语法错误,大概就是这么个意思。
Jeepeng
2017-02-09 19:48:57 +08:00
function fn() {
return new Promise((resolve, reject) => {
// do something
resolve()
})
}
Sparetire
2017-02-10 01:22:18 +08:00
异步是会传染的,最好 async 其次 co+generator ,或者把这个函数也 promise 化返回,最次 callback
zgoing
2017-02-10 08:13:12 +08:00
@abramstyle 非常感谢,你的代码解决了我的问题。可是我还是没有弄懂 koa 为什么会自动执行 promise 里的 resolve(),希望能帮帮我,谢谢
abramstyle
2017-02-10 09:53:13 +08:00
因为 async 会创建一个异步函数,这时候如果在 promise 前加上 await 那么就会等待这个 promise 完成再继续执行。
generator 同理。不过 generator 先出现,但是因为 async/await 是 ES7 的东西,所以大家都跳过 generator 直接用上了 async/await.

这两个概念理解起来可能有点费劲,具体你可以找一些文章来学习一下 async/await 和 generator 。比如 https://ponyfoo.com/articles/understanding-javascript-async-await
libook
2017-04-07 00:20:12 +08:00
函数里不能等 promise resolve 之后再返回,但是可以在 resolve 执行之前返回这个 promise 对象,让调用这个函数的程序拿到返回的 promise 再调用其 then 等方法拿到回调函数。
```javascript
function f() {
return new Promise((resolve, reject) => {
// 做其他事
resolve();
}) ;
}

let thePromise=f();// 这一句是执行 f 函数,返回了一个 Promise 对象,复制给 thePromise 变量
thePromise.then(function(){
// 这里就是在 f 函数的 resolve 执行完之后才执行的程序。
});
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/339362

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX