2016-07-05 5 views
1

Wenn function uploadLogs() abgelehnt wird, erwarte ich, dass die Zurückweisung aufbläht und von function reject(reason) gehandhabt wird, tut es aber nicht. Warum nicht?Warum springt die Ablehnung nicht auf?

Eine Ablehnung Handler für function uploadLogs() nimmt die Ablehnung:

return EventCollector.persist().then(function persistResolve() { 
     return EventCollector.uploadLogs().then(function uploadLogsResolve() { 
      return closeApp(); 
     }, function rejectionHandler() { 
      console.log("this rejection handler handles the event") 
     }); 
    }, function reject(reason) { 
     return closeApp(); 
    }); 

Aber wenn ich die Ablehnung Handler entfernen und die Ablehnung zu sprudeln erwarten und durch die Ablehnung Handler von persist() behandelt werden, denn es ist aus irgendeinem Grund doesn‘ t.

return EventCollector.persist().then(function persistResolve() { 
     return EventCollector.uploadLogs().then(function uploadLogsResolve() { 
      return closeApp(); 
     }); 
    }, function reject(reason) { 
     console.log("rejection is not handled when uploadLogs() fails"); 
     return closeApp(); 
    }); 

Ist nicht Versprechen Verkettung und Zurückweisung sprudeln sollen auf diese Weise funktionieren?

+0

Können Sie mehr Kontext geben, als nur sagen, fehlschlägt. Die Funktion reject wird aufgerufen, wenn das Versprechen, das von uploadLogs() zurückgegeben wird, zurückgewiesen wird. – M22an

Antwort

1

Die Erfolgs- oder Zurückweisungshandler werden basierend darauf aufgerufen, ob ihr Versprechen erfolgreich aufgelöst wurde. Aber ihre Kinder werden innerhalb ihrer Erfolgsfunktionen aufgerufen, was bedeutet, dass an diesem Punkt bereits entschieden wurde, dass die Elternfunktion ein Erfolg ist, also gibt es keinen Grund, plötzlich die Elternfunktion zu versagen, nur weil etwas, was das Kind tut, ein Fehlschlag ist.

Also nein, es sollte nicht so funktionieren, als wenn man die Versprechen durch eine regelmäßige synchrone Konfiguration ersetzen würde. Du würdest nicht erwarten, dass sich das so verhält, wie du es von den Versprechen erwartet hast, oder?

if(persist()) { 
    if(upload()) { 
    closeApp(); 
    } 
    else { 
    console.log('This would obviously not go into the below else for persist().'); 
    } 
} 
else { 
    closeApp(); 
} 

Dies ist in etwa das Verhalten, das ein Versprechen nur asynchron simuliert.

Verwandte Themen