在这里,在使用 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);
});
}
});
最佳答案
是否使用return
语句完全是函数中所需的控制流。它实际上与 promise 无关。如果您不想或不需要在函数中执行更多代码,并且您尚未在条件中完全隔离,则使用 return
退出该功能。无论您是否使用 promise ,都会遇到同样的问题。
记住,所有resolve()
或reject()
要做的就是更改 promise 的状态(假设它处于挂起状态),然后,任何 .then()
或.catch()
处理程序被安排在当前运行的 Javascript 将控制权返回给系统后执行。它们只是像其他函数调用一样的函数调用。
调用 resolve()
后不必使用 return 语句或reject()
。
所以,无论是 return
声明是否合适完全取决于您的代码。如果您不想在该 block 中执行更多代码,则 return
。如果您不想浪费时间,请调用resolve()
或reject()
在 block 的其他地方(实际上不会对 promise 做任何事情),然后使用 return
。如果您的代码已经在条件 block 内,并且不会执行您不想执行的任何其他代码,则不需要 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()
在你已经拒绝或解决之后, promise 不会改变任何事情。但是,我认为让不需要运行的代码运行是一种浪费且有点令人困惑的做法。所以,我总是使用 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)
的检查因为这应该是成功的案例。
或者,我会 promise Job.find()
更一般地说,在较低的级别,所以我的逻辑流程都是 promise 。
关于javascript - Promise 中的代码执行和使用 return 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42060975/