Skip to content

异步函数 uni.createBLEConnection 没有被 Promisify #1543

Closed
@benlypan

Description

问题描述
[问题描述:尽可能简洁清晰地把问题描述清楚]
uni.createBLEConnection 是一个异步函数,框架没有把他 Promisify,返回的不是 Promise

复现步骤
[复现问题的步骤]

console.log(uni.createBLEConnection());

可以看到返回值不是 Promise

预期结果
[使用简洁清晰的语言描述你希望生效的预期结果]

实际结果
[这里请贴上你的报错截图或文字]

系统信息:

  • 发行平台: 微信小程序
  • 操作系统: 全平台
  • HBuilderX版本 [如使用HBuilderX,则需提供 HBuilderX 版本号]
  • uni-app版本 v2.6.9
  • 设备信息 全平台

补充信息
[可选]
[根据你的分析,出现这个问题的原因可能在哪里?]
@dcloudio/uni-mp-weixin/index.js 中判断是否被 Promisify 的逻辑如下

const SYNC_API_RE =
  /^\$|sendNativeEvent|restoreGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;

const CONTEXT_API_RE = /^create|Manager$/;

const ASYNC_API = ['createBLEConnection'];

const CALLBACK_API_RE = /^on|^off/;

function isContextApi (name) {
  return CONTEXT_API_RE.test(name)
}
function isSyncApi (name) {
  return SYNC_API_RE.test(name) && ASYNC_API.indexOf(name) === -1
}

function isCallbackApi (name) {
  return CALLBACK_API_RE.test(name) && name !== 'onPush'
}

function handlePromise (promise) {
  return promise.then(data => {
    return [null, data]
  })
    .catch(err => [err])
}

function shouldPromise (name) {
  if (
    isContextApi(name) ||
    isSyncApi(name) ||
    isCallbackApi(name)
  ) {
    return false
  }
  return true
}

可以看到,在 shouldPromise 中执行 isContextApi(name) 时,因为 createBLEConnectioncreate 开头的,满足了 isContextApi 的条件,返回了 true, 导致 shouldPromise 返回了 false。代码中存在 const ASYNC_API = ['createBLEConnection']; 片段,可以看出考虑了这个函数的 Promisify,却有逻辑漏洞。将 isContextApi 函数修改为以下逻辑可修复错误

function isContextApi (name) {
  return CONTEXT_API_RE.test(name) && ASYNC_API.indexOf(name) === -1
}

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions