由于缺乏可以轻松捕获此类错误的类型系统(您考虑过 Typescript 还是 Flow?),您可以使用Systems Hungarian Notation作为您的变量名称。选择后缀的前缀,如P
, Promise
or$
并将其添加到所有Promise变量中,类似于通常使用Async
后缀命名异步函数的方式。然后只做类似的事情
const debug = await debugPromise
你可以很快看到这if (debug)
很好,但if (debugPromise)
不是。
一旦我将 async/await 引入某些函数,使用它们的每个函数也必须转换为 async 函数,以便能够等待返回值。最终甚至一些全局常量也变成了 promise
我不会那样做。尝试使尽可能少的函数异步。如果他们自己没有做本质上异步的事情,而只是依赖一些Promise的结果,那么将这些结果声明为函数的参数。一个简单的例子:
// Bad
async function fetchAndParse(options) {
const response = await fetch(options);
// do something
return result;
}
// usage:
await fetchAndParse(options)
// Good:
function parse(response) {
// do something
return result;
}
// usage:
await fetch(options).then(parse) // or
parse(await fetch(options))
相同的模式可以应用于全局变量 - 使它们成为每个函数的显式参数,或者使它们成为包含所有其他函数的module函数的参数作为闭包。然后await
全局Promise在module中只Promise一次,在声明或执行其他任何东西之前,然后使用普通的结果值。
// Bad:
async function log(line) {
if (await debugPromise)
console.log(line);
}
async function parse(response) {
await log("parsing")
// do something
return result;
}
… await parse(…) …
// Good:
(async function mymodule() {
const debug = await debugPromise;
function log(line) {
if (debug)
console.log(line);
}
function parse(response) {
log("parsing")
// do something
return result;
}
… parse(…) …
}());