如果在finally块中传递了null,react-native环境会将其视为一个函数,

vjrehmav  于 5个月前  发布在  React
关注(0)|答案(4)|浏览(75)

描述

如果用户代码错误地将 null 传递给 finally 块,react-native 将抛出 TypeError: null is not a function 错误。
Node.js 或浏览器都不会在变量被错误地设置为 null 时调用 finally 中的变量。

Node.js
$ node
Welcome to Node.js v20.15.1.
Type ".help" for more information.
> const onPress = async () => Promise.resolve('success').finally(null);
undefined
> await onPress()
'success'
>
Browser

已在 Google Chrome Version 127.0.6533.73 (Official Build) (arm64) 的浏览器控制台中验证

> const onPress = async () => Promise.resolve('success').finally(null);
undefined
> await onPress()
'success'

重现步骤

检查重现器的 README

React Native 版本

0.74.3

受影响的平台

运行时 - iOS

npx react-native info 的输出

System:
  OS: macOS 14.5
  CPU: (10) arm64 Apple M1 Pro
  Memory: 5.92 GB / 32.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 20.15.1
    path: ~/.nvm/versions/node/v20.15.1/bin/node
  Yarn:
    version: 3.6.4
    path: ~/.nvm/versions/node/v20.15.1/bin/yarn
  npm:
    version: 10.7.0
    path: ~/.nvm/versions/node/v20.15.1/bin/npm
  Watchman:
    version: 2024.07.15.00
    path: /opt/homebrew/bin/watchman
Managers:
  CocoaPods:
    version: 1.15.2
    path: /opt/homebrew/bin/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 23.5
      - iOS 17.5
      - macOS 14.5
      - tvOS 17.5
      - visionOS 1.2
      - watchOS 10.5
  Android SDK:
    API Levels:
      - "31"
      - "33"
      - "34"
      - "35"
    Build Tools:
      - 30.0.3
      - 31.0.0
      - 33.0.0
      - 33.0.1
      - 34.0.0
      - 35.0.0
    System Images:
      - android-35 | Google Play ARM 64 v8a
    Android NDK: Not Found
IDEs:
  Android Studio: 2024.1 AI-241.18034.62.2411.12071903
  Xcode:
    version: 15.4/15F31d
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 1.8.0_422
    path: /usr/bin/javac
  Ruby:
    version: 3.3.4
    path: /Users/trivikr/.rvm/rubies/ruby-3.3.4/bin/ruby
npmPackages:
  "@react-native-community/cli": Not Found
  react:
    installed: 18.2.0
    wanted: 18.2.0
  react-native:
    installed: 0.74.3
    wanted: 0.74.3
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: true
  newArchEnabled: false
iOS:
  hermesEnabled: true
  newArchEnabled: false

堆栈跟踪或日志

N/A

重现器

https://github.com/trivikr/react-native-type-error-null-is-not-a-function 以重现

截图和视频

该错误最初出现在 AWS SDK for JavaScript v3 的 aws/aws-sdk-js-v3#6269(评论)中,其中错误被抛出
在重现器应用程序中,错误被抛出,但在 React Native 界面中显示为警告。
重现器的 README 中提供了截图

wztqucjr

wztqucjr1#

⚠️添加或重新格式化版本信息
i️我们无法在您的问题报告中找到或解析React Native的版本号。请使用此模板,并报告您的版本,包括主要、次要和补丁编号 - 例如:0.70.2
5jvtdoz2

5jvtdoz22#

⚠️添加或重新格式化版本信息
i️我们无法在您的问题报告中找到或解析React Native的版本号。请使用此模板,并报告您的版本,包括主要、次要和补丁编号 - 例如:0.70.2
eivnm1vs

eivnm1vs3#

这个问题在所有支持的React Native版本中都可复现。
我在问题描述中更新了版本为0.74.3,这是复现时使用的版本。

ukqbszuj

ukqbszuj4#

TypeScript类型允许在finally块中使用null和undefined。
https://github.com/microsoft/TypeScript/blob/12ae799eda74aca6a4051f1ebee4d2d0c8d817a2/src/lib/es2018.promise.d.ts#L11
然而,MDN上的Promise.prototoype.finally()提到onFinally是一个函数。MDN上的Promise.prototype.then()表示:
如果它不是一个函数,那么它会被内部替换为一个恒等函数((x) => x),这个恒等函数只是将履行值向前传递。
我们怀疑Node.js和浏览器在传递null或undefined时复制了then()的行为,以便应用程序不会抛出错误。

相关问题