在这里,在使用promise时,我需要返回resolve
和reject
方法
代码执行顺利但如果有多个条件语句,那么reject
和resolve
会自动结束,或者我们必须使用return语句
const getJobs = (filters, fieldASTs) => new Promise((resolve, reject) => {
const AST = fieldASTs.fieldNodes[0].selectionSet.selections[0]
.selectionSet.selections[0].selectionSet.selections;
const FIELDS = _.map(AST, n => n.name.value);
if (_.includes(FIELDS, 'employer')) {
Job.find(filters, (err, d) => {
if (err) return reject(err);
// should i need to return or just use reject
if (err === null && d === null) return reject(null);
// return resolve(d) or only resolve()
return resolve(d);
});
} else {
Job.find(filters, (err, d) => {
// here also
if (err) return reject(err);
// here too
return resolve(d);
});
}
});
答案 0 :(得分:1)
是否使用return
语句完全取决于您的函数中所需的控制流程。它实际上与承诺无关。如果您不希望或需要在函数中执行任何更多代码,并且您尚未完全隔离条件,则使用return
退出该函数。无论您是否使用承诺,都是同样的问题。
请记住,所有resolve()
或reject()
都会更改承诺的状态(假设它处于暂挂状态),然后是任何.then()
或.catch()
处理程序计划在将来执行后,当前运行的Javascript将控制权返回给系统。它们只是函数调用,就像其他函数调用一样。
调用resolve()
或reject()
后,您不必使用return语句。
因此,return
语句是否合适完全取决于您的代码。如果您不想在该块中执行更多代码,则return
。如果您不想浪费时间在块中的其他位置调用resolve()
或reject()
(实际上不会对承诺执行任何操作),请使用return
。如果您的代码已经在条件块中,并且不执行其他任何您不想执行的代码,那么就不需要return
。
例如,在代码的这一部分中:
if (_.includes(FIELDS, 'employer')) {
Job.find(filters, (err, d) => {
if (err) return reject(err);
if (err === null && d === null) return reject(null);
return resolve(d);
});
}
使用return
是合适的,因为不需要在当前函数中执行任何更多代码。如果您在那里省略了return
,那么您的代码仍然可以正常运行(在这种特殊情况下),因为您运行的额外代码实际上不会执行任何操作,因为在您之后调用reject()
或resolve()
已经拒绝或解决了这个承诺并没有改变任何事情。但是,我认为让代码运行不需要运行是一种浪费而且有点令人困惑的做法。所以,在这种情况下,我总是使用return
或条件。
就个人而言,我可能会写这样的代码:
if (_.includes(FIELDS, 'employer')) {
Job.find(filters, (err, d) => {
if (err) return reject(err);
if (d === null) return reject(new Error("unexpected null result from Job.find()"));
return resolve(d);
});
}
注意:我删除了if (err === null)
的支票,因为这应该是成功案例。
或者,我会更低级别地宣传Job.find()
,所以我的逻辑流程都是承诺。