我是承诺的新手,我正在努力了解它们是如何运作的。
首先是我的问题:
当在路由功能中处理请求时,它是否等待所有承诺,我的意思是当我使用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});
}
});
});
内部的bookmanager我有以下
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:未处理的承诺拒绝(拒绝ID:6):错误:发送后无法设置标头。
我想使用像Rx(Reactive Extensions)这样的方法。
有人可以解释什么是错的,承诺在这种情况下如何真正起作用?
答案 0 :(得分:2)
1。当在路由函数中处理请求时,它是否等待所有promise,我的意思是当我使用promise或callback时,它是一个新的范围并继续执行。
等待您通过res
发送回复。您不必为响应事件而这样做,在异步过程(如承诺解析)完成之后,它在以后是绝对正常的。
2。如果我在计时器中保留req / res对象然后响应用户,用户会看到什么?在明确发送响应之前,请求才会被阻止?
是
我有几个问题。
1。当抛出错误时,我的书仍然被创建。
您始终开始创建图书的过程,无论数据是否经过验证都是正确的。 new Promise
开始工作。
2。我有以下错误
node:8753)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:6):错误:发送后无法设置标头。
您正在创建承诺并将其存储在createBook
中,如果verifyData
拒绝,则永远不会处理对该承诺的拒绝。所以你得到了未经处理的承诺拒绝。
你可以摆脱保存书籍的整个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
都是同步进程,因为这就是你使用它们的方式。
实际上,鉴于这种情况,我认为没有必要为了验证数据而创建承诺。所以它可能更简单:
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");
}
}