У меня есть помощник HTTP, который возвращает обещание для каждого запроса. Иногда эти запросы зависят друг от друга. Я запутываю себя в кодировании того, что я считаю анти-шаблонами для этого.
Обычно, когда цепочки обещаний вы используете .then()
function giveMeASimplePromise(){
return new Promise( function(resolve, reject){
setTimeout( function(){
console.log("I'm finishing a promise.");
resolve();
}, 3000 );
});
}
giveMeASimplePromise().then( giveMeASimplePromise ).then( giveMeASimplePromise );
//prints 'I'm finishing a promise' 3 times spaced 3 seconds apart
Но я запутываюсь, если есть обещание внутри одного из тех обещаний, которое должно быть частью цепочки.
Это подходит мне, потому что у меня есть вспомогательная функция HTTP, которая возвращает обещание с каждым запросом. Пара этих запросов зависит друг от друга. И весь процесс должен вернуть обещание, чтобы все было асинхронно.
function login( credentials ){
//outer promise that's returned and either needs to resolve or reject based
// on complete login cycle
return new Promise( function(resolve, reject){
//inner promise checking for username/password match. can be rejected
// for several reasons.
var checkCredentials = httpHelper.checkCredentials( credentials );
checkCredentials.then( function(result){
if ( result.credentialsMatch ){
//another inner promise checking for privilege levels. never rejects.
var checkPrivileges = httpHelper.getPrivileges( result.userID );
getPrivileges.then( function(result) ){
if( result.privilege > 0 ){
//want this to resolve the entire chain
resolve();
}else{
//want this to reject the entire chain
reject('You do not have sufficient privileges.');
}
}
}else{
reject('Incorrect username and/or password.');
}
}).catch( function(reason){
reject( reason );
});
});
}
var credentials = { ... };
var loginResult = login( credentials ).then( function(value){
console.log('Logged in successfully.');
}).catch( function(reason){
console.log('Could not log in: ', reason);
})
Это анти-паттерн, верно? Это неправильно.