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

标签 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);
            });
        }
    });

最佳答案

是否使用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/

相关文章:

javascript - 如何在javascript slider 中淡入淡出?

javascript - npm install 的工作原理

node.js - 如何配置通过 Heroku/Node.js 读取的简单静态 AWS S3 图像(403 访问错误)

node.js - 使用 JWT 和 googleapis 进行身份验证时出错(错误 :0906D06C:PEM routines:PEM_read_bio:no start line)

javascript - 将可多次调用的Javascript回调转换为promise

javascript - 是否可以从单独的 html 页面单击 html 页面上的按钮?

javascript - Microsoft Edge 刷新按钮不执行 onLoad javascript 代码

javascript - firestore 集中的 Promise 参数未定义

Javascript - 按 2 个属性对对象数组进行排序

javascript - Angular $q 和 google.maps.api