2017-09-19 3 views
0
inProgress = false; 

//async function which send value to device 
function send(_callback){ 
    try{ 
     // code that generate error 
     _callback(); 
    }catch(err){ 
     console.log("_callback doesn't start"); 
    } 
} 

function prepare_to_send(){ 
    try{ 
     inProgress= true; 
     send(function(){ 
      send(function(){ // isn't runned, because was err inside send 
      inProgress = false; 
      }) 
     }); 
    }catch(err){ 
     inProgress = false; 
    } 
} 

Comme dans le code ci-dessus. Si l'erreur était dans la fonction d'envoi, la fonction prepare_to_send ne modifiait pas la variable globale InProgress en false, beacuse _callback et catch de prepare_to_send ne sont pas exécutées. Est-ce possible sans changer la fonction d'envoi?Exécution de la capture externe à partir de l'essai imbriqué

Est-ce possible?

+0

Non, vous devez changer envoyer fonction d'une manière ou d'une autre. Bien que vous deviez vraiment réévaluer votre approche entière – musefan

+0

Vous pourriez retourner une valeur de la fonction d'envoi et agir en conséquence. – teroi

+0

vous souhaitez probablement que la fonction d'envoi utilise deux rappels, un rappel réussi et un rappel d'erreur. Appelez le callback d'erreur du bloc de catch et le callback de succès du bloc try après le code qui peut lancer une erreur. –

Répondre

0

Si _callback n'est pas une fonction asynchrone, vous pouvez re-jeter l'erreur, ou même une nouvelle:

inProgress = false; 
 

 
//async function which send value to device 
 
function send(_callback) { 
 
    try { 
 
    // code that generate error 
 
    _callback(); 
 
    } catch (err) { 
 
    console.log("_callback doesn't start"); 
 
    throw err; 
 
    } 
 
} 
 

 
function prepare_to_send() { 
 
    try { 
 
    inProgress = true; 
 
    send(function() { 
 
     throw 'error'; 
 
    }); 
 
    } catch (err) { 
 
    inProgress = false; 
 
    console.log(err); 
 
    } 
 
} 
 

 
prepare_to_send();

Mais si _callback est asynchrone, vous semblez à l'autre, alors vous devrez faire face à des promesses tout le chemin, ie. adapter l'intégralité du code. Vous pouvez également ajouter un rappel d'erreur comme indiqué dans la section commentaire:

inProgress = false; 
 

 
//async function which send value to device 
 
function send(_callback, errorCallback) { 
 
    // code that generate error 
 
    _callback(errorCallback); 
 
} 
 

 
function prepare_to_send() { 
 
    inProgress = true; 
 
    send(function(errorCallback) { // Your callback have to call another function on error 
 
    try { 
 
     throw 'error'; 
 
    } catch (err) { 
 
     errorCallback(); 
 
    } 
 
    }, function() { 
 
    inProgress = false; 
 
    console.log('error occured'); 
 
    }); 
 
} 
 

 
prepare_to_send();