我有异步函数返回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)
}
}
答案 0 :(得分:1)
您可以毫无问题地使用第一个示例。
当您使用async
时,您的函数将返回Promise
。如果您的代码为sync
,则返回的承诺的状态为resolved
,并且可以安全地在其上运行任何与承诺相关的代码(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(即布尔值)doSync
是假的,它将返回Promise
,将解析为false。这是一个巨大的差异。
为什么?
您的函数有时会返回一个promise,而其他时候会返回一个布尔值。这是不一致的。
答案 1 :(得分:0)
第一个是正确的。如果不需要,就没有必要强迫任何异步。上下文切换不是免费的,因此如果它不必等待任何事情完成,请不要尝试制作它。
答案 2 :(得分:0)
基于您对其中一个答案的评论,因为问题的回答为How do you create custom asynchronous functions in node.js?
问题是,这个函数是不一致的:有时它是异步的,有时它不是。假设您有这样的消费者:
在js环境中,像nodejs这样的常见做法是,无论实际代码是否真的异步,都应该始终将异步执行的回调称为异步。
所以你想知道以下代码是否会破坏这种常见的实践。
async function doSomething() {
return true
}
doSomething()
.then(res => {
console.log(res)
})
情况并非如此,因为在这里你处理Promises并且允许一个Promise立即解决,上面的代码基本上和你写的一样:
Promise.resolve(true)
.then(res => {
console.log(res)
})
链接部分(then
/ catch
)确保了异步行为,您传递给then
/ catch
的回调将被称为异步:
async function doSomething() {
return true
}
console.log('before');
doSomething()
.then(res => {
console.log('with in callback')
})
console.log('after');

正如您所看到的,日志的顺序是:
之前
后 在回调中
因此,这与常规异步回调函数所期望的顺序相同。