2016-09-21 2 views
1

Je travaille sur NodeJS projet, j'ai utilisé Promise Dans mon code à la chaîne des méthodes, je devais abandonner dans l'une des chaîne 'thens deComment puis-je abandonner JavaScript Promise?

findEmployeeByCW('11111', "18-09-2016"). 
then(function() { 
    return findEmployeeByCWE('111111', "18-09-2016", '111111') 
}, function() { 
    console.log('createEmployeeLoginBy') 
    createEmployeeLoginBy('111111', "18-09-2016", '111111'). 
    then(function (log) { 
     SaveEmployeeLogToDb(log) 
     // *************** 
     // ^_^ I need to exit here .... 
    }) 
}) 
.then(function (log) { 
    return updateLoginTimeTo(log, '08-8668', '230993334') 
}, function() { 
    return createNewEmployeeLog('224314', "18-09-2016", 
     '230993334', '08-99') 
}) 
.then(SaveEmployeeLogToDb).then(DisplayLog).catch(function (e) { 
    console.log(e); 
}) 
+0

Vous pouvez stocker une référence à votre promesse, puis appelez 'rejeter' sur cela après' SaveEmployeeLogToDB' –

+0

vous pouvez simplement lancer une erreur et la promesse sera rejetée –

+0

@mortezaT malheureusement, je l'ai utilisé, mais il a exécuté le suivant alors rejeter –

Répondre

0

Vous ne pouvez actuellement « annuler » promesses. Mais vous pouvez utiliser une exception à cette fin:

findEmployeeByCW('11111', "18-09-2016"). 
then(function() { 
return findEmployeeByCWE('111111', "18-09-2016", '111111') 
}, function() { 
console.log('createEmployeeLoginBy') 

//*** "return" added 
return createEmployeeLoginBy('111111', "18-09-2016", '111111'). 
then(function (log) { 
SaveEmployeeLogToDb(log) 

//**** 
throw new Error('promise_exit'); 
//**** 

}) 
}) 
.then(function (log) { 
return updateLoginTimeTo(log, '08-8668', '230993334') 
}, function() { 
return createNewEmployeeLog('224314', "18-09-2016", 
'230993334', '08-99') 
}) 
.then(SaveEmployeeLogToDb).then(DisplayLog).catch(function (e) { 

//**** 
//Only log if it's not an intended exit 
if(e.message != 'promise_exit'){ 
    console.log(e); 
} 
//**** 

}) 
+0

J'ai déjà essayé, ça n'a pas fonctionné, ça a continué d'exécution, j'ai aussi essayé de lancer une exception dans la méthode SaveEmployeeLogToDb, mais ça a aussi échoué !! –

+0

Essayez la réponse mise à jour. Retourner le createEmployeeLoginBy devrait fonctionner. –

2

Si je comprends bien l'intention, il n'y a pas besoin ici d'annuler ou de lancer.

Vous devriez être en mesure d'atteindre vos extrémités par réarrangement:

findEmployeeByCW('11111', "18-09-2016") 
.then(function() { 
    return findEmployeeByCWE('111111', "18-09-2016", '111111') 
    .then(function(log) { 
     return updateLoginTimeTo(log, '08-8668', '230993334'); 
    }, function(e) { 
     return createNewEmployeeLog('224314', "18-09-2016", '230993334', '08-99'); 
    }); 
}, function(e) { 
    return createEmployeeLoginBy('111111', "18-09-2016", '111111'); 
}) 
.then(SaveEmployeeLogToDb) 
.then(DisplayLog) 
.catch(function(e) { 
    console.log(e); 
}); 

Cela devrait fonctionner à condition qu'un objet log est toujours livré à SaveEmployeeLogToDb par tous les chemins possibles à ce moment-là, comme le laisse entendre l'original code.

+0

Mr @ Roamer-1888 vous voulez dire que je devrais bien construire mon système pour que je n'aie pas besoin de l'annulation !! ?? c'est peut-être une solution, mais si j'ai besoin de coder pour annuler, dois-je reconstruire le système pour le code unique? –

+0

merci beaucoup pour vos conseils Mr @ Roamer-1888, cela fonctionne pour moi, je pense que l'idée principale pour une promesse est de bien construire le système, et si une erreur se produit, il devrait être barboté pour être manipulé à la queue de la chaînage –