我在其他地方调用这个getShelfList方法时如果数据是从缓存中获取的我就可以正常使用getShelfList().then() 但如果数据是调用接口获取的返回的是undefined我就无法点then,我想问问为什么这跟异步返回是不是有啥关系,为什么会这样?我应该怎么处理呢
我在其他地方调用这个getShelfList方法时如果数据是从缓存中获取的我就可以正常使用getShelfList().then() 但如果数据是调用接口获取的返回的是undefined我就无法点then,我想问问为什么这跟异步返回是不是有啥关系,为什么会这样?我应该怎么处理呢
一个函数要想保证外在的一致性的话,应当确保在所有分支 return
相同的类型:
JS 中如果不显式 return
的话就是 return undefined
。
使用 TypeScript
就不会遇到这种问题了,代之以更复杂的问题。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
2 回答4.7k 阅读✓ 已解决
4 回答4.3k 阅读✓ 已解决
来简化一下你的代码,把结构理出来
那么,上面一个
return this.setShelfList(shelfList)
是返回的哪个函数呢?注意找到它所处的函数(包括箭头函数),发现它的返回值实际上是给 Promise 的 then 处理去了,但是处理完了并没有使用(没有接下来的 then,也没有使用 await 之类的东西。
如果改用 await 语法,会更容易
看,现在两个 return 都在同一个函数里,所以它们都是 getShelfList 的返回语句。但是注意,这还没完 —— 注意到 getShelfList 前面的 async 修饰没有?这个修饰表示它返回的是一个 Promise,所以外层使用的时候并不能直接拿到值,而是需要 then 或者再次 await 来拿值。
关于 await 语法,请阅读「理解 JavaScript 的 async/await」