Promise中的代码执行和使用return语句

时间:2017-02-06 05:36:50

标签: javascript node.js promise

在这里,在使用promise时,我需要返回resolvereject方法

代码执行顺利但如果有多个条件语句,那么rejectresolve会自动结束,或者我们必须使用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);
            });
        }
    });

1 个答案:

答案 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(),所以我的逻辑流程都是承诺。