【问题标题】:reject() and return do not terminate executionreject() 和 return 不会终止执行
【发布时间】:2021-03-02 04:44:18
【问题描述】:

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

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 的输出,但是函数执行并没有终止,响应似乎成功但实际上,它不是......这里有什么问题?

【问题讨论】:

  • 您正在返回作为参数传递给 .catch 的箭头函数,而不是周围的 foo 函数。
  • 我明白了,谢谢。但是我应该如何管理这个你能发布一个替代处理策略吗?
  • 这能回答你的问题吗? How to return data from promise
  • 这看起来很像Promise constructor antipattern。请edit您的问题包含完整的代码,以便我们可以正确判断您要做什么并建议如何做。
  • 很可能, foo() 应该返回自己的承诺,而不是尝试解决/拒绝某些外部new Promise()。最简单的形式是function foo() { return insertData(fields) }insertDate() 表达式引起的错误将自动反映在返回的 Promise 的结算中。

标签: javascript promise fetch


【解决方案1】:

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

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 reject | return resolve。 另请注意,您可以解决返回另一个未解决的承诺,如果失败,它将被saveData 的更高级别捕获。

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 2013-06-17
    • 2019-08-12
    • 2013-04-06
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    相关资源
    最近更新 更多