首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >返回不会终止承诺/然后链

返回不会终止承诺/然后链
EN

Stack Overflow用户
提问于 2018-06-05 01:48:28
回答 1查看 137关注 0票数 0

我有以下代码,我用来注册用户。

代码语言:javascript
复制
const pgp = require('pg-promise')();
const crypto = require('./crypto.js');

const db = pgp(connection);

const querySelect = (text, params) => {  
  const s = pgp.as.format(text, params);  
  return db.any(s)
  .then(data => {    
    return data;    
  })
  .catch(error => {
    return error;
  });
}

const queryInsert = (text, params) => {  
  const s = pgp.as.format(text, params);  
  return db.one(s)
  .then(data => {    
    return data;    
  })
  .catch(error => {
    return error;
  });
}

const signup = (user) => {
  return new Promise((resolved, rejeted)=>{    
    return querySelect('select username from user WHERE username = $1', [user.username])      
    .then(res => {
      if (res.length == 0) {              
        return true;
      }      
      return resolved(false);  //SHOULD STOP + RETURN HERE                                 
    })
    .then(hashPasswordRes=>{      
      return crypto.hashPassword(user.password);
    })
    .then(queryRes=>{      
      if (queryRes) {
        return queryInsert('insert into user (username,password) values ($1,$2) RETURNING id', 
        [user.username, user.password]);      
      } else {            
        return rejeted('error while signup');
      }
    })
    .then(res=>{
      resolved(true);          
    })
    .catch(error => {
        return rejeted('error while signup');
    });// catch
  }) //promise
};//signup

exports.signup = signup;

这基本上就是整个文件。我想这很简单。

问题是,在我注释SHOULD STOP + RETURN HERE的这一点上,它确实返回了false (所以这意味着已经是一个现有的用户名,就像插入的用户名一样),但是执行永远不会停止,所以用户最终保存在数据库中(即使执行了return resolved(false); )。

我在这里做错了什么?当我的代码中只有pg模块时,这通常是有效的。当我使用pg-promise时,它开始出现这个问题。

坦率地说,我不知道为什么"return“没有停止函数的执行。敬请指教

(节点8.11.1,express 4.16.3,pg 7.4.2,pg-promise 8.4.4)

谢谢

编辑

需要说明的是,这里是不带pg-promise的相同文件,它工作得很好。变量名称会发生变化,但您可以看到其中的逻辑。我尝试在pg-promise中使用相同的逻辑

代码语言:javascript
复制
  const crypto = require('./crypto.js');
  const {Client} = require('pg');


const getuser = (mail, client) => {
  return new Promise((resolved, rejeted)=>{
    return client.query('select mail from user WHERE mail = $1',[mail])
    .then(res => {
      resolved(res.rows);
     })
     .catch(e => {
        rejeted(e);
        client.end();
     }); // catch
  })//promise
} //getUser


const signup = (user) => {
  return new Promise((resolved, rejeted)=>{
    client.connect().then(() => {
        getuser(user.email, client) 
        .then(getUserRes => {
          if (getUserRes.length==0) {
            return true;
          }
          client.end();
          return resolved(false);
        })
        .then(hashPasswordRes=>{
            return crypto.hashPassword(user.password);
        })
        .then(queryRes=>{
          if (queryRes) {
            const nowtime = new Date();
            return client.query('insert into user(mail, password) values ($1,$2)',
            [user.email, queryRes])
          } else {
            client.end();
            return rejeted('some error');
          }
        })
        .then(res=>{
          resolved(true);
          client.end();
        })
    }) // client.connect then
    .catch(error => {
      rejeted('some error');
      client.end();
    });// catch
  }) //promise
};//signup


exports.signup = signup;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 04:30:19

返回结束正在运行的当前函数,它不是promise链。所以这一部分:

代码语言:javascript
复制
return resolved(false);  //SHOULD STOP + RETURN HERE 

结束当前函数,即:

代码语言:javascript
复制
res => {
      if (res.length == 0) {              
        return true;
      }      
      return resolved(false);  //SHOULD STOP + RETURN HERE                                 
    }

请注意,箭头声明了一个函数。

如果你想停止一条链,你可以这样做

代码语言:javascript
复制
Promise.resolve(res)
.then(res => {
    if (shouldKeepGoing(res)) {
        return allTheOtherPromises(res)
    }
    return true
})

const allTheOtherPromises = res => {
    // Here you do all the promises you were doing
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50686140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档