Javascript 将承诺与Node JS express一起使用
我是承诺的新手,我试图理解它们是如何工作的 首先,我的问题是:Javascript 将承诺与Node JS express一起使用,javascript,node.js,express,promise,es6-promise,Javascript,Node.js,Express,Promise,Es6 Promise,我是承诺的新手,我试图理解它们是如何工作的 首先,我的问题是: 当在路由函数中处理请求时,它会等待所有承诺吗?我的意思是,当我使用承诺或回调时,它是一个新的作用域,执行会继续下去 如果我在定时器中保存一个req/res对象,然后响应用户,用户会看到什么?在我显式发送响应之前,请求将被阻止 因此,我遇到了以下问题 这是我的路线 router.post('book', authHandler.provideMiddleware(), (req, res) => { bookMana
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方法,否则调用success
我这里有几个问题
res
发送响应。您不必在响应事件时这样做,在异步过程(如承诺解析)完成后,稍后再这样做是绝对正常的
二,。如果我在定时器中保存一个req/res对象,然后响应用户,用户会看到什么?在我显式发送响应之前,请求将被阻止
对
我这里有几个问题
一,。当抛出错误时,我的书仍然被创建
无论数据是否被验证为正确,您总是开始创建书籍的过程<代码>新承诺开始工作
二,。我有以下错误
节点:8753)未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:6):错误:发送后无法设置头
您正在创建一个承诺并将其存储在createBook
中,如果verifyData
拒绝,则从不处理该承诺的拒绝。所以你得到了一个未经处理的拒绝承诺
你可以摆脱保存这本书的整个newpromise
,只需将它放入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");
}
}
回答得好!我只想插入一条注释,说明可以将
verifyData.then(()=>book.save())
重写为verifyData.then(book.save).then(…)
,不过我很确定您有意省略了它,以使示例更加清晰!但是,对于OP来说,了解它总是有用的!:)@丹尼尔:可能不是:。然后(book.save)
将调用book.save
,并在调用过程中将设置为未定义。但它大概需要将这个
设置为book
。另一个选项是。然后(book.save.bind(book))
,但我发现箭头函数更清晰。(bind
对于避免创建闭包非常有用。)当然,Doh!我在那里读代码读得太快了,从来没有意识到它不是一个保存函数,将已解析的书作为参数!谢谢T.J@丹尼尔布:对不起,忘记说“谢谢”了,谢谢你对答案的赞美!(我把太多精力放在上了,然后
的事情上。:-)代码仍然存在与中相同的问题