2015-11-25 2 views
0

У меня есть обучающая игра с использованием Angular, Express, Mongo и Node. Теперь я изучаю, как использовать обещания, поэтому я могу подождать, пока что-то не закончится, прежде чем начинать что-то еще.Как вернуть переменную из обещания Q-узла?

Прямо сейчас, я пытаюсь подождать, пока база данных не сообщит, что пользователь, пытающийся войти в систему, уже имеет учетную запись. Мне это удалось, поэтому, если пользователь не существует, .then() вызовет функцию onReject, которая создаст пользователя.

user имеет основную учетную запись и может воспроизводить сеансы. В течение каждой сессии он получит новый player. Если user существует и пытается войти в систему, а его player будет зарегистрирован, он получит это player назад. Если player не существует, сервер создаст его для него.

Но у меня возникла проблема с переменной logged, в которой говорится, что пользователь зарегистрировал player. Во второй строке функции findUser я создаю переменную с именем logged, и я пытаюсь ее вернуть, поэтому могу использовать функцию onResolve.

UserModel.find(
      { username: username, password: password}, 
      findUser).then( 
      onResolve, 
      onReject ); 

На Promise разрешения

На Promise отклонять

 var onReject = function() { 
      userModel.save(function (err) { 
       if (!err) { 
        //CREATE USER 
        //CREATE USER'S PLAYER 
       } 
      }); 
     }); 

Функция findUser

var findUser = function (err, data) { 
    var logged = false; 
    var userSearched = Q.defer(); 
    if (data.length) { //IF USER IS IN DATABASE 
     logged = true; 
     userSearched.resolve(logged); 
    } else { 
     userSearched.reject(logged); 
    } 

    return userSearched.promise; 
}; 

Как я могу вернуть переменную logged из обещания использовать везде, где мне нужно?

+0

Вы не можете вернуть 'logged' за пределы обещания. Вместо этого верните обещание и используйте его везде, где вам нужно «logged». –

+0

Я возвращаю userSearched.promise. Как мне получить доступ к зарегистрированному значению? – Rodmentou

+0

см. Ответ jfriend00 –

ответ

3

Если вы возвращаете значение из обработчика .then(), тогда это значение становится выполненным значением обещания.

var onResolve = function (logged) { 

     if (logged) { 
     //RETURN USER'S PLAYER 
     } else { 
     //CREATE USER'S PLAYER 
     } 
     // ** add this ** 
     return logged; 
    } 

Вы можете использовать его в последующих .then() обработчиков:

UserModel.find({ username: username, password: password}, findUser) 
    .then(onResolve, onReject) 
    .then(function(result) { 
     // can access result here 
    }); 

Если этот код находится внутри функции, то вы можете вернуть обещание от UserModel.find():

function someFunc() { 
    return UserModel.find({ username: username, password: password}, findUser) 
     .then(onResolve, onReject); 

} 

И затем добавьте обработчик .then() к возвращенному обещанию.

someFunc().then(function(result) { 
    // access result here 
}); 

Или в вашей findUser() функции:

var findUser = function (err, data) { 
    var userSearched = Q.defer(); 
    if (data.length) { //IF USER IS IN DATABASE 
     userSearched.resolve(true); 
    } else { 
     userSearched.reject(false); 
    } 

    return userSearched.promise; 
}; 

findUser.then(function(val) { 
    // access resolved value here 
}, function(err) { 
    // access rejected reason here 
}); 

Хотя, findUser() не выглядит асинхронными, так что я не понимаю, почему вы используете обещание с ним вообще. Похоже, вы можете просто вернуть true или false прямо из функции.

+0

Спасибо за ваш быстрый и полный ответ. Я пытаюсь. ;) – Rodmentou

Смежные вопросы