在promise中进行异步调用

时间:2017-03-30 18:29:21

标签: javascript node.js asynchronous promise amazon-dynamodb

首先,我知道这个问题已被多次询问,但我无法知道如何做到这一点。 我是Node.js的新手并处理它的异步方面。

这是我的代码

passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' }, function (email, pass, done) {   
    Users.query(email).exec(function (err, item) {
        const message = 'Login Invalid';
        if (err) return done(err);

        var promise = GetHash({ item, pass });        
        promise.then((data) => {                        
            return done(null, data)
        }).catch((err) => {
            console.log(err);
            return done(null, false, { message });
        });                             
    });    
}));

function GetHash(userPasswordRequest) {
    return new Promise(function (resolve, reject) {
        if (userPasswordRequest.item && userPasswordRequest.item.Items[0]) {
            var userRecord = userPasswordRequest.item.Items[0].attrs;
            if (userRecord.old) {
                if (crypto.createHash('sha256').update(userPasswordRequest.pass, 'ucs-2').digest('base64') === userRecord.password) {
                    var newHash = bcrypt.hashSync(userPasswordRequest.pass, 10);
                    Users.update({ email: userRecord.email, password: newHash, old: null }, function (err, newItem) {
                        if (err) { console.log(err); } else {
                            console.log('first call');
                            resolve(newItem.attrs);
                        }
                    });                
                }
            }
            else {
                if (bcrypt.compareSync(userPasswordRequest.pass, userRecord.password)) {
                    console.log('first call');
                    resolve(userPasswordRequest.item.Items[0].attrs);                    
                }
            }
        }
        reject();
    })
}

问题在于:

 if (crypto.createHash('sha256').update(userPasswordRequest.pass, 'ucs-2').digest('base64') === userRecord.password) {
                    var newHash = bcrypt.hashSync(userPasswordRequest.pass, 10);
                    Users.update({ email: userRecord.email, password: newHash, old: null }, function (err, newItem) {
                        if (err) { console.log(err); } else {
                            console.log('first call');
                            resolve(newItem.attrs);
                        }
                    });                
                }

由于Users.update是异步的,我在解决之前拒绝承诺。

我尝试过许多事情,承诺和许多其他事情的承诺,但我无法正常工作。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您不应该使用reject作为转换,但在发生错误情况时会明确调用。

所以这样:

if (userPasswordRequest.item && userPasswordRequest.item.Items[0]) {
  ...
} else {
  return reject(Error('invalid userPasswordRequest'));
}

还有:

if (bcrypt.compareSync(userPasswordRequest.pass, userRecord.password)) {
  console.log('first call');
  return resolve(userPasswordRequest.item.Items[0].attrs);                    
} else { 
  return reject(Error('invalid password'));
}

这也不对:

if (err) { console.log(err); }

不要只记录错误,拒绝承诺:

if (err) {
  console.log(err);
  return reject(err);
}

正如您所看到的,在解决或拒绝后返回也是一种很好的形式。