NodeJS: получить значение вне асинхронной функции - PullRequest
0 голосов
/ 22 января 2019
const _sodium = require('libsodium-wrappers');
(async (model = this._modelUser) => { //Had to pass this._modelUser otherwise it'd be undefined
    await _sodium.ready;
    const sodium = _sodium;

    let password = sodium.crypto_pwhash_str(Utils.urldecode(data.password), 7, 677445);
    model.password = password;
    console.log('In:' + model.password); //Good value
})();

console.log('Out:' + this._modelUser.password); //Undefined

Так что в этом случае this._modelUser.password является неопределенной внешней функцией.Я хотел бы подождать, пока this._modelUser получит правильное значение пароля, прежде чем продолжить.

У кого-нибудь есть идеи, как это исправить?Спасибо за помощь1010 *https://www.npmjs.com/package/libsodium

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Обещания помогают в достижении этого.



const _sodium = require('libsodium-wrappers');
(async (model = this._modelUser) => { d
    await _sodium.ready;
    const sodium = _sodium;

    let password = sodium.crypto_pwhash_str(Utils.urldecode(data.password), 7, 677445);
    model.password = password;

    return new Promise((resolve, reject) => {
    if(model.password) resolve(model.password); 
    else reject(model)
   })
})()
.then((a) =>{
//handling code
})
.catch((a) => {
//handling code
})
0 голосов
/ 22 января 2019

, поэтому цель async / await состоит в том, чтобы не блокировать ничего и возвращать объект Promise , который можно использовать для воздействия на возвращаемое.

ItТрудно точно знать, что вы планируете делать с вашей моделью после назначения пароля, но я бы порекомендовал вам назначить пароль для вашей модели вне текущей функции с помощью чего-то вроде:

const _sodium = require('libsodium-wrappers');

const generatePassword = async () => {
    await _sodium.ready;
    const sodium = _sodium;

    // Not sure where you have got data from, could be passed in locally.
    return sodium.crypto_pwhash_str(Utils.urldecode(data.password), 7, 677445);
}

generatePassword()
    .then((password) => {
        this._modelUser.password = password;
    })
    .catch((error) => console.log('error: ', error))

Вы можетеконечно, разделить это еще больше, чтобы быть более функциональным.

...