javascript - 我怎样才能将这些 JavaScript 承诺重写为不那么复杂?
问题描述
我写了这个,但它看起来很粗糙,它用于节点 js,所以所有值都需要按顺序获取
import tripfind from '../model/tripfind';
import addbook from '../model/addbook';
import bookfind from '../model/bookfind';
function addBook(info) {
return new Promise((resolve, reject) => {
let rowcount = -1;
bookfind(0, -1, -1).then((result) => {
if (result) {
rowcount = result.rowCount;
} else {
rowcount = 0;
}
tripfind(info.trip_id, 0).then((xresult) => {
let val = '';
if (xresult === 'false') {
val = 'trip is not valid';
resolve(val);
} else {
addbook(info, rowcount).then((value) => {
if (value === 'invalid id') {
resolve('invalid id');
}
resolve(value);
}).catch((err) => {
if (err) {
reject(err);
}
});
}
}).catch((error) => {
reject(error);
});
}).catch((err) => {
if (err) {
reject(err);
}
});
});
}
export default addBook;
就是上面的代码,代码也被导出并作为promise函数处理,如果可以请帮忙
解决方案
像这样?
function addBook(info) {
return bookfind(0, -1, -1).then((result) => tripfind(info.trip_id, 0)
.then((xresult) => (xresult === 'false') ?
'trip is not valid' :
addbook(info, result ? result.rowCount : 0)
)
);
}
或与async/await
async function addBook(info) {
const result = await bookfind(0, -1, -1);
const xresult = await tripfind(info.trip_id, 0)
return xresult === "false"?
'trip is not valid' :
addbook(info, result ? result.rowCount : 0);
}
避免 Promise/Deferred 反模式:什么是明确的 Promise 构造反模式,我该如何避免?
并删除无意义/无用的代码,例如这个函数:
(value) => {
if (value === 'invalid id') {
resolve('invalid id');
}
resolve(value);
}
始终解决为value
. 这就像return value === 1? 1: value
或者(error) => { reject(error); }
只是将错误“转发”到返回的承诺。
或者这个构造
let rowcount = -1;
//....
if (result) {
rowcount = result.rowCount;
} else {
rowcount = 0;
}
//....
doSomethingWith(rowcount)
可以概括为doSomethingWith(result ? result.rowCount : 0)
推荐阅读
- android - Xamarin Form 本地化在 Android 调试模式下抛出异常
- javascript - 使用 nodejs fluent-ffmpeg 流式传输到 icecast 服务器
- qt3d - 检测 3D 对象上的触摸,除了鼠标点击
- python-2.7 - (Python 模块序列号)没有名为 utility.compatibility 的模块
- ios - 以编程方式检查核心数据持久存储是否包含记录(Objective-c)
- python - 如何处理多公司产品的网站订单中的税收?
- c# - ASP.NET-MVC 不呈现视图
- node.js - 由于 nodejs 错误,Docker 容器未启动
- spring-mvc - 如何忽略百里香中的特定字段?
- html - 选择父母和孩子以找到跨度