如何使用 expo-sqlite 执行带有 typescript 的 sql?
Posted
技术标签:
【中文标题】如何使用 expo-sqlite 执行带有 typescript 的 sql?【英文标题】:how to use expo-sqlite execute sql with typescript? 【发布时间】:2021-06-09 17:47:27 【问题描述】:大家好,我想使用 expo-sqlite 到事务对象来执行 sql 语句。
但是,我在定义错误函数的返回值时遇到了问题。
示例代码如下:
tx.executeSql(
// sql statement (ok)
"...",
// input arguments (ok)
[...],
// success case: since I use it in a promise, so I use: resolve(...) (ok)
() =>
resolve()
,
// failed case: I want to reject it, use reject()
// But I got an Error here! (Wrong!!!)
// Here ask me to return a boolean value, but how??? true or false???
(_, err) =>
reject(err) // not enough???
)
从类型定义文件中,我知道,我需要为错误回调函数返回一个布尔值,但是哪个呢?是真是假???
你知道怎么做吗???
PS。这里是关于 expo-sqlite 的官方文档:https://docs.expo.io/versions/latest/sdk/sqlite/
【问题讨论】:
【参考方案1】:我不知道为什么错误回调函数确实需要布尔返回类型。由于我们无论如何都解决/拒绝了承诺,我认为我们可以节省地忽略返回类型。
您可以在下面找到我的打字稿同步示例:
export const fetchTypeSaveSql = async <T>(sqlStatement: string, args: any[] | undefined): Promise<T[]> =>
return new Promise((resolve) =>
db.transaction(tx =>
tx.executeSql(
sqlStatement, args,
(_, result) =>
resolve(Array.from(result.rows as any) as T[])
,
(_, error): boolean =>
console.warn(error)
resolve([])
return false
)
)
)
【讨论】:
为什么不返回true? 更新了答案【参考方案2】:SQLStatementErrorCallback
的返回类型是boolean
(而不是void
),因为它用于指示是否处理了错误。
如果错误得到处理(即return true
),整个事务不会失败。如果它没有被处理(即return false
),那么它会被处理。 只有在您能够从错误中适当恢复时,您才应该return true
。
请记住,executeSql
仅在事务中使用(通过 db.transaction
或 db.readTransaction
创建)。事务接受它自己的成功和错误回调。
您可以通过从这里向后工作来检查源代码中的这个:https://github.com/nolanlawson/node-websql/blob/7b45bf108a9cffb1c7e16b9a7dfec47be8361850/lib/websql/WebSQLTransaction.js#L64-L68
if (batchTask.sqlErrorCallback(self, res.error))
// user didn't handle the error
self._error = res.error;
return onDone();
【讨论】:
以上是关于如何使用 expo-sqlite 执行带有 typescript 的 sql?的主要内容,如果未能解决你的问题,请参考以下文章