我有返回 true 或 false 的异步函数。它看起来像以下一个:
class User {
async canManageGroup(group) {
if (typeof group === 'number') {
// group - id
group = await getGroupById(group)
} // else group is already loaded from DB
return this.id === group.manager.id
}
}
如果group
参数是组的ID 那么函数将异步调用DB,所以函数canManageGroup
将异步执行。但是,如果 group
参数是组模型,那么函数只会调用 return this.id === group.manager.id
否则它将同步执行。以这种方式编写代码是一种好习惯吗?或者我应该将同步代码转换为异步代码?
function makeAsync(cb) {
return new Promise(resolve => setImmediate(() => resolve(cb())))
}
class User {
async canManageGroup(group) {
if (typeof group === 'number') {
// group - id
group = await getGroupById(group)
} // else group is already loaded from DB
return await makeAsync(() => this.id === group.manager.id)
}
}
最佳答案
您可以毫无问题地使用第一个示例。
当您使用async
时,您的函数将返回一个Promise
。如果您的代码是 sync
,则返回的 promise 的状态将为 resolved
并且可以安全地在其上运行任何与 promise 相关的代码(then
、catch
等)。
例如:
async function truePromise() {
return true;
}
truePromise().then(function(value){
console.log("Promise value:", value);
});
正常工作:)
你应该这样做吗?
是的。多亏了 async
关键字,它没问题并且工作正常。
您不能做的是:
function dontDoIt(doSync) {
if (doSync) return false;
return Promise.resolve(false)
}
为什么?因为:
- 如果
doSync
是真实的,它将返回 false(即 bool 值) - 如果
doSync
为假,它将返回一个将解析为假的Promise
。
这是一个巨大的差异。
为什么?
您的函数有时返回一个 promise ,有时返回一个 bool 值。这是不一致的。
- doSync(true) 是 bool 值,您不能使用 await 或 .then。
- doSync(false) 是一个 Promise,您可以使用 await 和 then。
关于javascript - 具有同步和异步代码的异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49900347/