- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这段代码,有很多返回 block ,例如 SignUp()
连接器.js
const connectors = {
Auth: {
signUp(args) {
return new Promise((resolve, reject) => {
// Validate the data
if (!args.email) {
return reject({
code: 'email.empty',
message: 'Email is empty.'
});
} else if (!isEmail(args.email)) {
return reject({
code: 'email.invalid',
message: 'You have to provide a valid email.'
});
}
if (!args.password) {
return reject({
code: 'password.empty',
message: 'You have to provide a password.'
});
}
return encryptPassword(args.password, (err, hash) => {
if (err) {
return reject(new Error('The password could not be hashed.'));
}
return User.create(Object.assign(args, { password: hash }))
.then((user) => {
resolve(createToken({ id: user._id, email: user.email }));
})
.catch((err2) => {
if (err2.code === 11000) {
return reject({
code: 'user.exists',
message: 'There is already a user with this email.'
});
}
return reject(err2);
});
});
});
},
};
module.exports = connectors;
然后调用此代码的另一个代码:
const connectors = require('./connectors');
CallsignUp(root, args) {
const errors = [];
return connectors.Auth.signUp(args)
.then(token => ({
token,
errors
}))
.catch((err) => {
if (err.code && err.message) {
errors.push({
key: err.code,
value: err.message
});
return { token: null, errors };
}
throw new Error(err);
});
}
如何在 ES6 或 ES7 或 ES2017 中避免这种情况?
有:
return()
.then()
return()
.then
然后循环返回:
return()
return()
return()
来自 PHP 的这段代码看起来很疯狂,因为返回函数返回函数,我不清楚,javascript 中的名称如何是这种类型的 block 返回代码?调用再次返回更多代码的函数?
更新:
代码不是我的,完整源在
https://github.com/jferrettiboke/react-auth-app-example
我想通过例子来理解:
return encryptPassword(args.password, (err, hash) => {
if (err) {
return reject(new Error('The password could not be hashed.'));
}
return User.create(Object.assign(args, { password: hash }))
.then((user) => {
.catch((err2) => {
return reject(err2);
/src/utils/auth.js(这里是encryptPassword)
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt-nodejs');
const config = require('../config');
exports.encryptPassword = (password, callback) => {
// Generate a salt then run callback
bcrypt.genSalt(10, (err, salt) => {
if (err) { return callback(err); }
// Hash (encrypt) our password using the salt
return bcrypt.hash(password, salt, null, (err2, hash) => {
if (err2) { return callback(err2); }
return callback(null, hash);
});
});
};
返回调用函数和返回值与函数有3种? OOP 从来不是这样的,@dashmud 建议如何使用 Async/Await,我不想学习回调之类的老东西
最佳答案
此代码需要以多种方式进行重构。首先,您真的、真的不想在同一个逻辑流中混合使用 promises 和普通的异步回调。它弄得一团糟,破坏了 promise 的许多优点。然后,您有一个在 new Promise()
中使用 promises 的反模式。然后,您需要更多嵌套(您可以改为链接)。
这是我的建议:
function encryptPasswordPromise(pwd) {
return new Promise((resolve, reject) => {
encryptPassword(pwd, (err, hash) => {
err ? reject(new Error("The password could not be hashed.")) : resolve(hash);
});
});
}
const connectors = {
Auth: {
signUp(args) {
// Validate the data
let err;
if (!args.email) {
err = {code: 'email.empty', message: 'Email is empty.'};
} else if (!isEmail(args.email)) {
err = {code: 'email.invalid', message: 'You have to provide a valid email.'};
} else if (!args.password) {
err = {code: 'password.empty', message: 'You have to provide a password.'};
}
if (err) {
return Promise.reject(err);
} else {
return encryptPasswordPromise(args.password).then(hash => {
args.password = hash;
return User.create(args);
}).then((user) => {
return createToken({id: user._id, email: user.email});
}).catch(err2 => {
if (err2.code === 11000) {
throw new Error({code: 'user.exists', message: 'There is already a user with this email.'});
} else {
throw err2;
}
});
}
}
}
};
变更摘要:
Promise.reject(err)
。encryptPassword()
这样您就不会将常规回调与 promise 逻辑流混合在一起,然后您可以正确地返回和传播错误。return new Promise()
移除整个代码的包装,因为您所有的异步操作现在都已 promise ,因此您可以直接返回 promise 。这也确实有助于正确处理错误。Object.assign()
,因为似乎没有原因。在您的编辑中,您要求解释此代码段:
return encryptPassword(args.password, (err, hash) => {
if (err) {
return reject(new Error('The password could not be hashed.'));
}
return User.create(Object.assign(args, { password: hash }))
.then((user) => {
.catch((err2) => {
return reject(err2);
encryptPassword()
。undefined
所以 return
所做的就是控制程序流(退出包含的函数),但是因为没有代码在返回相同级别后,这是不必要的。encryptPassword()
。该回调是异步的,这意味着它会在一段时间后调用。err
和hash
。在 node.js 异步调用约定中,如果第一个参数是真值(例如包含一些真值),那么它表示一个错误。如果为假(通常为 null
),则没有错误,第二个参数包含异步操作的结果。reject
没有返回值,因此 return
仅用于在该点退出回调(因此回调中没有其他代码运行)。User.create()
并将其传递给其中设置了新密码的 args 对象。User.create()
返回一个 promise,因此它的结果被 .then()
方法捕获并传递给它的回调。User.create()
完成时,它将解决其 promise ,这将导致调用 .then()
回调并结果将传递给它。如果该操作出错,则不会调用 .then()
回调,而是调用 .catch()
回调。在那个 .catch()
回调中,父 promise 被拒绝。这是一个 promise 反模式(在另一个 promise 中解决父 promise),因为在正确的错误处理中很容易出错。我的回答说明了如何避免这种情况。关于javascript - 避免在 javascript 中循环多次返回 - async/await 以解决回调金字塔或回调 hell ,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46167078/
我想简化/减少我的代码,所以我尝试将具有重复参数的类的初始化放在它们自己的扩展类中。这是一个基于 Pyramid & Cornice 的 REST API。 我如何初始化 pyramid.httpex
我正在尝试构建一个由 4 个 DIV 组成的金字塔。布局如下所示: ------ | #1 | ------ ---------------- | #2 | #3 | #
我是 3d 绘图的新手。我只想用 5 个点 build 一个金字塔,然后从中切出一个平面。我的问题是我不知道如何填充边。 points = np.array([[-1, -1, -1],
我需要创建金字塔 slider 。 正如您在我当前的实现中看到的那样,我需要有一个位于其余元素顶部的中心图像。它们形成金字塔结构。图像也被放置在彼此下面,这种效果打破了一切,因为我需要转换它们(中心图
我一直在玩我在这里找到的演示:http://codepen.io/singhiskng/pen/dqiGj 我正在尝试制作一个 4 边形金字塔。
在jsp中实现如图所示的金字塔, 代码如下: 大致思路如下: 1、先画出前5行。因为 i+空格数=总行数,所以第一行的空格数是 总行数-i(第几行),然后画出 *,*的数目=2*i-11;
我在尝试找出一种使用用户输入创建金字塔的方法时遇到了很大的麻烦。它应该是这样的。 Enter a number between 1 and 9: 4 O O O O OOOO OOOO OOOO OO
我一直在寻找解决厄运金字塔的办法。到目前为止,我得出的结论如下: router.use('/create', function(res,req,next) { try { v
我刚刚开始处理。因此,我想创建一个函数,允许任何用户输入边数来创建 3D 金字塔。我正在使用处理 3。我需要一些帮助。提前致谢。我编写了一段目前有效的代码,但我想概括它。任何建议/提示将不胜感激。提前
我使用 JavaScript 创建了一个金字塔以下是我迄今为止使用 for 循环尝试的代码: function showPyramid() { var rows = 5; var ou
我被告知数据库超时(连接、交互、等待)设置为 30 秒。该数据库上有一个网站,人们往往会闲置超过 30 秒。 使用sqlalchemy,我需要在继续查询之前检查mysql连接是否仍然有效,否则站点会出
另一个棘手的问题。你在这里看到的是我的物理金字塔,它由 3 个 LED 构成,在 1 个平面上形成一个三角形,另一个 LED 在中间中心,比其他 3 个高约 18 毫米。第 4 个使三角形成为金字塔。
目标: 我正在尝试生成类似于下面给出的格式的金字塔。这需要一个基本的 Java 程序来接受用户输入、将数字转换为字符串、使用嵌套循环并生成格式化输出。下面是使用 8 行的所需输出示例。 Enter t
我的数据是多维组合数据(所有维度总和为 1 或 100)。我已经学会了如何使用三个变量来创建二维三元图。 我想添加第四个维度,使我的情节看起来像这样。 我愿意使用 python 或 R。我现在正在使用
我的数据是多维组合数据(所有维度总和为 1 或 100)。我已经学会了如何使用三个变量来创建二维三元图。 我想添加第四个维度,使我的情节看起来像这样。 我愿意使用 python 或 R。我现在正在使用
我是一名优秀的程序员,十分优秀!