对承诺感到困惑。我需要在这里 return 吗?

Confused about promises. Do I need to return here?

所以我最近开始学习 Promises (Bluebird),现在我正在尝试尽可能多地使用它们,但是如果我需要 return promises 在这案例.

这是我制作的 Passport LocalStrategy:

passport.use(new LocalStrategy(function(username, password, done) {
    users.get(username) // A
        .then(function(user) {
            if (!user) {
                return done(null, false, { message: 'Incorrect username.' });
            }
            bcrypt.compare(password, user.password).then(function(result) { // B
                if (result) {
                    return done(null, user);
                }
                return done(null, false, { message: 'Incorrect password.' });
            });
        })
        .catch(function(err) {
            return done(err);
        });
}));

users.get(username) 行 A 使用 pg-promise 库来 return 一个承诺,如果在数据库中找到一个用户,它将解析为一个用户,如果没有,则为 false找到了。

B 行的

bcrypt.compare 使用 bcrypt 检查密码和哈希值是否匹配。它 return 是一个将解析为 true 或 false 的承诺。

代码运行完美,我只是不知道 A 行和 B 行是否应该 return 像这样

return users.get(username) // A

return bcrypt.compare(password, user.password).then(function(result) { // B

代码在有和没有return承诺的情况下都有效。

难道Passport/Node就等着看到return done?这是否意味着这个函数是同步的,即使它里面的所有东西都是异步的?通常你会 return 一个承诺,然后在它上面使用 .then() 但是因为 LocalStrategy 没有使用 .then().catch() 我不需要 return 任何东西?非常感谢任何输入。谢谢。

Passport 不支持 Promise,因此您必须在回调中调用 done。您可以 return users.get(username) 但从未使用 return 值(承诺)。不要忘记你可以像下面这样链接承诺:

users.get(username)
    .then(function(user) {
        if (!user) {
            return done(null, false, { message: 'Incorrect username.' });
        }
        return bcrypt.compare(password, user.password);
   })
   .then(function(result) { // B
        if (result) {
            return done(null, user);
        }
        return done(null, false, { message: 'Incorrect password.' });
    })
    .catch(function(err) {
        return done(err);
    });