当前位置: 首页 > 知识库问答 >
问题:

reject()和return不终止执行

狄宜然
2023-03-14

下面的函数负责管理后端服务中的请求

const saveData = (body) => {

    // console.log("in save method body: ", JSON.stringify(body), "\n")
    return new Promise(function(resolve, reject) {
        const {fields, item} = body
        
        pool.query('Select count(1) as record_count from my_table where id= $1', [fields.id], (error, results)=>{
            if(error){
                reject(error)
                return
            }

            if(results && results.rows && results.rows[0].record_count > 0){
                console.log("in update fields are ", fields, "\n")
                updateData(fields).catch(error =>{
                    reject(error)
                    return
                })
            }
            else{
                console.log("in insert fields are \n", fields, "\r\n")
                insertData(fields).catch(error =>{
                    console.log("error is ", error)
                    reject(error)
                    return
                })          
            }            

            insertDataDetail(item).then().catch(error => {
                reject(error)
                return
            })
        })
        resolve("Save is done")
    })
}

InsertData(..)返回Promise >

我看到console.log输出,但函数执行没有终止,响应似乎成功了,但实际上并非如此...这里怎么了?

共有1个答案

袁鸿畴
2023-03-14

问题是你总是在兑现诺言。你基本上有这样的:

const saveData = () => {
  return new Promise((resolve, reject) => {
    // you call the query function which is async

    resolve("Save is done"); // this is always resolving the function before the query runs

  });
}

相反,您需要这样做:

const saveData = () => new Promise((resolve, reject) => {
  pool.query('query', [], (err, results) => {
    if (err) {
      return reject(err);
    }

    // whatever else you check
    return reject(new Error('something is not like I want it'));


    // everything is fine, continue
    return resolve(insertDataDetail(item));

  });
  // if you put something here it will run before the query is ran.
});

注意return rejectreturn resolve。还要注意,您可以解析返回另一个未解析的promise,如果失败,它将在更高级别的catch fromsavedata中被捕获。

 类似资料:
  • 我有一个方法getNextPrime(int num),它应该在该方法接收的值之后识别最接近的质数。 如果num是偶数,它将递增它并再次调用自己。如果它是奇数,它将运行一个for循环来检查它是否可以被3和num的一半值之间的奇数整除。如果是,那么它将把num增加2,方法将再次调用自己,否则它将返回新的num值,这是一个质数。 问题是,当程序到达return语句时,它将跳转到if语句并返回num 1

  • Creates a new sequence whose values exclude the elements of this sequence identified by the specified predicate. Signature Sequence.reject = function(rejectFn) { /*...*/ } Sequence.reject = function r

  • 我想处理使用者从队列中获得的不成功消息,并将它们重新排队。 想象一下我有这样的情况: 我想请求它,但要将它发送回队列的开头: 我用我的应用程序上的几行代码解决了问题,但我想知道是否存在更好的解决方案,也许直接使用RabbitMQ的某些功能。

  • 我对使用rxjava进行反应性编程是新手,在经历了更简单的示例之后,我现在试图弄清楚如何使用连续流。下面这个例子的问题是,在我接受了3个元素后,程序不会终止。我的假设是,我不知何故需要取消订阅我的可观察的,但我不完全掌握如何终止while循环并使程序退出。 我遇到了下面的RxJava帖子--终止无限流,但我仍然不知道我遗漏了什么。

  • 问题内容: 如何防止gnome-terminal退出给定命令后退出? 我正在从cronjob调用gnome-terminal,以创建用户可访问的终端。最初为终端提供了要运行的特定程序。例如 这很好,除了退出“ myprog”时,gnome-terminal也是如此。我如何保持它运行,而只是回到终端提示符? 问题答案: 尝试这个:

  • 在我的spring boot应用程序中,我有一个组件,它有一个方法,在下面的无限循环中运行一些作业,实际上它检查数据库中的一些数据: