拒绝后在 catch 块中查询
Query in catch block after reject
我正在使用 reactjs 开发一个应用程序,它可以让人们发布一些 post 带有主题标签、提及和媒体的内容。我开始在数据库中保存 post,经过大量控制后,如果发生某些错误,我需要从数据库中删除 post。这里是带有 promises 和 catch 块的函数:
connectDb()
.then( () => { return savePost() } )
.then( () => { return postHashtagRoutine() } )
.then( () => { return iteratePostMedia() } )
.then( () => { return detectLanguage() } )
.then( () => { return updatePost() } )
.then( () => { console.log("pre conn release") } )
.then( () => { conn.release() } )
.then( () => { resolve( { success : "done" } )
.catch( (err) => {
connectDb()
.then( () => { console.log("create post error", err) } )
.then( () => { return removePost() } )
.then( reject(err) )
})
现在的问题是,当我在 postHashtagRoutine() 中调用 reject 时,如果某些主题标签包含停用词,则不会调用 catch 块,并且不会调用控制台日志和 removePost() 函数已执行。
这里是我在 postHashtagRoutine()
中调用拒绝的代码部分
Promise.all(promisesCheckStopwords)
.then( () => {
if ( stopwordsId.length > 0){
reject("stopwordsId in post");
}
})
您可以 throw
在 Thenable
处理程序中拒绝。
A then call will return a rejected promise if the function throws an error or returns a rejected Promise.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
我建议使用 throw <result>
而不是 reject([result])
。
例如:
throw "stopwordsId in post"
我还建议您 return 第二次调用 connectDb()
以确保承诺链链接在一起。
If onFulfilled returns a promise, the return value of then will be resolved/rejected by the promise.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
第一个代码块:
connectDb()
.then( () => { return savePost() } )
.then( () => { return postHashtagRoutine() } )
.then( () => { return iteratePostMedia() } )
.then( () => { return detectLanguage() } )
.then( () => { return updatePost() } )
.then( () => { console.log("pre conn release") } )
.then( () => { conn.release() } )
.then( () => { return { success : "done" } )
.catch( (err) => {
return connectDb()
.then( () => { console.log("create post error", err) } )
.then( () => { return removePost() } )
.then( throw err )
})
第二个代码块:
Promise.all(promisesCheckStopwords)
.then( () => {
if ( stopwordsId.length > 0){
throw "stopwordsId in post"
}
})
我正在使用 reactjs 开发一个应用程序,它可以让人们发布一些 post 带有主题标签、提及和媒体的内容。我开始在数据库中保存 post,经过大量控制后,如果发生某些错误,我需要从数据库中删除 post。这里是带有 promises 和 catch 块的函数:
connectDb()
.then( () => { return savePost() } )
.then( () => { return postHashtagRoutine() } )
.then( () => { return iteratePostMedia() } )
.then( () => { return detectLanguage() } )
.then( () => { return updatePost() } )
.then( () => { console.log("pre conn release") } )
.then( () => { conn.release() } )
.then( () => { resolve( { success : "done" } )
.catch( (err) => {
connectDb()
.then( () => { console.log("create post error", err) } )
.then( () => { return removePost() } )
.then( reject(err) )
})
现在的问题是,当我在 postHashtagRoutine() 中调用 reject 时,如果某些主题标签包含停用词,则不会调用 catch 块,并且不会调用控制台日志和 removePost() 函数已执行。
这里是我在 postHashtagRoutine()
中调用拒绝的代码部分 Promise.all(promisesCheckStopwords)
.then( () => {
if ( stopwordsId.length > 0){
reject("stopwordsId in post");
}
})
您可以 throw
在 Thenable
处理程序中拒绝。
A then call will return a rejected promise if the function throws an error or returns a rejected Promise.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
我建议使用 throw <result>
而不是 reject([result])
。
例如:
throw "stopwordsId in post"
我还建议您 return 第二次调用 connectDb()
以确保承诺链链接在一起。
If onFulfilled returns a promise, the return value of then will be resolved/rejected by the promise.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
第一个代码块:
connectDb()
.then( () => { return savePost() } )
.then( () => { return postHashtagRoutine() } )
.then( () => { return iteratePostMedia() } )
.then( () => { return detectLanguage() } )
.then( () => { return updatePost() } )
.then( () => { console.log("pre conn release") } )
.then( () => { conn.release() } )
.then( () => { return { success : "done" } )
.catch( (err) => {
return connectDb()
.then( () => { console.log("create post error", err) } )
.then( () => { return removePost() } )
.then( throw err )
})
第二个代码块:
Promise.all(promisesCheckStopwords)
.then( () => {
if ( stopwordsId.length > 0){
throw "stopwordsId in post"
}
})