javascript - reject() 和 return 不会终止执行

标签 javascript promise fetch

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

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<QueryResult<R>>

我明白了console.log输出但函数执行并没有终止,响应看起来成功但实际上不是...这里出了什么问题?

最佳答案

问题在于你总是在兑现 promise 。你基本上有这个:

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.
});

注意返回拒绝 | 返回解析。 另请注意,您可以解决返回另一个 Unresolved promise ,如果失败,它将被 saveData 的更高级别的捕获捕获。

关于javascript - reject() 和 return 不会终止执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64901147/

相关文章:

javascript - knex.js 查询 "promises"何时执行/解析?

javascript - 在 react 中,如何在获取后更新状态?

javascript - 如何仅获取 JavaScript 文件的一部分?

javascript - 如何根据回调的响应在 componentDidMount 中设置状态

javascript - 使用对象参数将javascript代码绑定(bind)到android代码

javascript - 验证Token JWT是否有效

javascript - 圆形 Div 周围的 Div

javascript - 转换 React 项目时出现 Typescript 错误

javascript - 在延迟/ promise 实现中使用计时器是一种邪恶吗?

javascript - 我应该如何不知道某件事是否是 promise ?