我是 promise 的新手,我正在尝试了解它们是如何工作的。
首先是我的问题:
当在路由函数中处理请求时,它是否会等待所有的 Promise,我的意思是,当我使用 Promise 或回调时,它是一个新的作用域,并且会进一步继续执行。
如果我在计时器中保留一个 req/res 对象,然后响应用户,用户会看到什么?在我明确发送响应之前,请求将被阻止?
所以我遇到了以下问题。
这是我的路线。
router.post('book', authHandler.provideMiddleware(), (req, res) => {
bookManager.createBook(req.body, {
onSuccess: function (data) {
respondSuccess(res,HttpStatus.OK, {'data': data});
},
onError: function (message) {
respondError(res, HttpStatus.HTTP_STATUS.BAD_REQUEST, {'error': message});
}
});
});
在图书管理器中我有以下内容
createBook(data, hook) {
let book = createBookFromRequest(data);
let verifyData = new Promise((resolve, reject) => {
let valid = checkBookData(book);
if(valid) {
resolve(book);
}
else {
reject("Invalid data");
}
});
let createBook = new Promise((resolve, reject) => {
book.save((err, result) => {
if (!err) {
reject("Error while saving");
}
else {
resolve(result);
}
});
});
verifyData
.then(() => {
return createBook;
})
.then((data) => {
hook.onSuccess(data);
})
.catch((error) => {
hook.onError(error);
});
}
我的想法是链接多个函数,如果发生任何错误,则调用 hook.onError 方法,否则调用成功。
我这里有几个问题。
- 当抛出错误时,我的书仍然会创建。
我遇到以下错误
Node :8753)UnhandledPromiseRejectionWarning:未处理的 promise 拒绝(拒绝ID:6):错误:发送后无法设置 header 。
我想使用像 Rx(响应式(Reactive)扩展)这样的方法。
有人可以解释一下哪里出了问题以及在这种情况下 promise 如何真正发挥作用吗?
最佳答案
1. When request is handled in a route function, does it wait for all promises, I mean that when I am using promise or callback it is a new scope and execution continues further.
它等待您通过 res
发送响应。您不必为了响应事件而这样做,在异步过程(如 promise 解析)完成之后,这绝对是正常的。
2. If I keep a req/res objects for example in timer and then respond to user, what will user see ? A request will just be blocked until I explicitly send response ?
是的。
I have several problems here.
1. When error is thrown, my book is still created.
无论数据是否经过验证,您都始终开始创建图书的过程。 new Promise
开始工作。
2. I have the following error
node:8753) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 6): Error: Can't set headers after they are sent.
您正在创建一个 Promise 并将其存储在 createBook
中,并且如果 verifyData
拒绝,则永远不会处理该 Promise 的拒绝。所以你会得到一个未处理的 promise 拒绝。
您可以摆脱保存书籍时的整个new Promise
,并将其放入verifyData
链中;见评论:
createBook(data, hook) {
let book = createBookFromRequest(data);
let verifyData = new Promise((resolve, reject) => {
let valid = checkBookData(book);
if (valid) {
resolve(book);
}
else {
reject("Invalid data");
}
});
verifyData
.then(() => book.save()) // The chain takes on the state of the promise
// returned by `book.save`
.then(data => {
hook.onSuccess(data);
})
.catch((error) => {
hook.onError(error);
});
}
在此,我假设 createBookFromRequest
和 checkBookData
都是同步进程,因为这就是您使用它们的方式。
实际上,鉴于这种情况,我认为您没有必要创建 promise 来验证数据。所以它可以更简单:
createBook(data, hook) {
let book = createBookFromRequest(data);
if (checkBookData(book)) {
book.save()
.then(_ => hook.onSuccess(data))
.catch(error => hook.onError(error));
} else {
hook.onError("Invalid data");
}
}
关于javascript - 在 Node JS Express 中使用 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43886305/