async 方法应该 return Promise.resolve 还是直接 return await 的值呢?

2017-07-25 22:19:44 +08:00
 tangyuan

虽然用上了 async await,但感觉还是不是特别明白,譬如下面这个例子

是直接 return await 出来但值呢?

async function func() {
  const data = await getDataAsyncFromSomeApi()
  return data
}

还是返回 Promise 呢?

async function func() {
  const data = await getDataAsyncFromSomeApi()
  return Promise.resolve(data)
}

又或者

async function func() {
  const data = await getDataAsyncFromSomeApi()
  return new Promise((resolve, reject) => {
    resolve(data)
  })
}
11576 次点击
所在节点    JavaScript
8 条回复
viko16
2017-07-25 23:02:15 +08:00
第一种
xieranmaya
2017-07-25 23:06:00 +08:00
写成第一种不如直接写成:
```js
async function func() {
return await getDataAsyncFromSomeApi()
}
func().then()
```
而写成上面的不如直接
```js
getDataAsyncFromSomeApi().then()
```
都是一样的。。。
xieranmaya
2017-07-25 23:07:37 +08:00
另外我写的第一种里的 await 也可以直接去掉
xieranmaya
2017-07-26 08:58:58 +08:00
你首先得把规则弄清楚啊
async function 返回的就是一个 promise
await 后面跟的必须是一个 promise
剩下的,只要你会 promise,你应该就会了
portals
2017-07-26 14:20:51 +08:00
```javascript
async function func() {
try {
}
}
```
portals
2017-07-26 14:22:42 +08:00
async function func() {
try {
const response = await getDataAsyncFromSomeApi()
return response
} catch (error) {
return error
}
}
这样就分别对应了 Promise.resolve 和 Promise.reject
DOLLOR
2017-07-26 15:17:37 +08:00
```
Promise.resolve(Promise.resolve(Promise.resolve(Promise.resolve('test'))))
.then(i=>{
console.log(i==='test');//true
})
```

明白了么? Promise 无论分装几次,永远都只有一层。也就是无论你用 Promise 包裹了几次,也只需一次 then 就能取出数据。
所以,在 async 函数里,无论你返回 Promise 还是普通的对象,你在外面调用时,await 得到的都是普通的对象。
我的意见:
```
async function func() {
return getDataAsyncFromSomeApi()
}
```
codehz
2017-08-02 17:49:16 +08:00
@DOLLOR #7 其实不加 async 也是对的。。。。

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

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

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

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

© 2021 V2EX