安全等待时
这个项目之所以可能,是因为
Safe Await是一个简单的方法 确保我们的错误得到处理.
安全保证
我最不喜欢的JavaScript async/await语法就是它投出错误. 这总是给我带来问题,因为人们总是忘记尝试抓住这些等待的发言。 我的另一个问题是,当你尝试捕捉时 所创造的新范围, 它只是使代码看起来糟糕 因为你必须开始思考变量的范围.
缓存
我们不需要创建安全功能,我们可以简单地将功能调用转换为安全调用,例如:
const stuff = await safeAwait(fetch('benzinga.com/things/and/stuff'));
if (stuff.err) {
console.log(stuff.err);
}
else {
console.log(stuff.ok);
}
如你所见,我们在这里所做的是 包装取回与 safeAwait 具有下列功能:
export type SafePromise<T> = Promise<{ err: Error; ok: undefined } | { err: undefined; ok: T}>
export const safeAwait = async <T>(promise: Promise<T>): SafePromise<T> => {
try {
return { ok: await promise };
} catch (err: any) {
return { err };
}
};
两者都值得注意的一件事是 safeAwait 返回安全保证。 这是用来表示你不必尝试抓住"承诺",以及它表明这是在上游某个地方检查的. 因为你真正需要尝试抓取的时间是使用API函数时. 在那之后,承诺是安全的,除非你 自己提出例外.
安全等待功能
解决这个问题的另一种方法是将功能包起来,使 safeFunction。那么,怎样 safeFunction 是吗? 它只需要一个函数作为参数,然后返回一个函数。 内在它只是尝试抓住你 并拖动结果.
const stuff = await safeFetch('benzinga.com/things/and/stuff');
if (stuff.err) {
console.log(stuff.err);
} else {
console.log(stuff.ok);
}
创建安全功能很容易. 仅此而已 safeAwaitFunction 作为参数的async函数.
const safeFetch = safeAwaitFunction(fetch);
现在我们有植入 fetch 总是返回 a SafePromise。 。 。 .
这是我们人类的核心概念 safe-await 软件包。 以下是简单的辅助函数和工具,它们只是使用 safe-await 图书馆.
帮助函数
安全磁盘
类似 Promise.Race 但为安全保证.
safeRace = <T>(promises: SafePromise<T>[]): SafePromise<T>
安全地图
类似“ 映射” 的函数用于数组, 但用于安全等待
实例
const quotesExist = (symbol) => {
safeMap(fetchQuote(symbol), quote => quote.doesExist)
};
安全的话
一个类似于 Promise.then 它允许您在承诺完成后添加运行的函数.
实例
const quotesExist = (symbol) => {
safeThen(fetchQuote(symbol), quote => { ok: quote.doesExist })
};
安全等待( A)
类似 Promise.all 不过,它返回a SafePromiseMultiError 允许:
safeAwaitAll = async <U, T extends readonly SafePromise<U>[]>(promise: T & SafePromise<U>[]): SafePromiseMultiError<U[]>