2017-05-08 4 views
2

werfen Ist es möglich, einen Fehler in den .then() Block in Axios absichtlich zu werfen? Zum Beispiel, wenn die API mit 204 Statuscode antwortet, könnte ich einen Fehler werfen und den catch-Block ausführen?Kann ich Fehler in Axios Beitrag basierend auf dem Antwortstatus

Zum Beispiel:

axios.post('link-to-my-post-service', { 
     json-input 
    }).then(response => { 
     if (response.status === 200) { 
      //proceed... 
     } 
     else { 
      // throw error and go to catch block 
     } 
    }).catch(error => { 
     //run this code always when status!==200 
    }); 

EDIT

Ich versuchte dies, aber es hat nicht funktioniert:

var instance = axios.create({ 
      validateStatus: function (status) 
      { 
       return status == 200; 
      } 
     }); 
axios.post('link-to-my-post-service', {input: myInput}, instance) 
    .then(response => { 
      dispatch({ 
        type: "FETCH_SUCCESS", 
        payload: response.data 
       }); 
     }).catch(error => { 
      dispatch({ 
       type: "FETCH_FAILED", 
       payload: error 
      }); 
     }); 

Wenn ich einen Statuscode 204 erhalten, noch die ausgeführt Block ist dann() Block anstelle des Catch-Blocks.

EDIT 2

Die richtige Antwort Vorschlag ist, diese mit Ilario suchen:

var instance = axios.create({ 
      validateStatus: function (status) 
      { 
       return status == 200; 
      } 
     }); 
instance.post('link-to-my-post-service', {input: myInput}) 
    .then(response => { 
      dispatch({ 
        type: "FETCH_SUCCESS", 
        payload: response.data 
       }); 
     }).catch(error => { 
      dispatch({ 
       type: "FETCH_FAILED", 
       payload: error 
      }); 
     }); 

Nun, wenn der Statuscode 200 der Blockcode Fang ausgeführt nicht gleich ist.

+0

froh, dass es jetzt funktioniert !! –

Antwort

4

Wenn Sie sich den GitHub Project Page ansehen, werden Sie die folgende Optionsbeschreibung bemerken.

/* `validateStatus` defines whether to resolve or reject the promise for a given 
* HTTP response status code. If `validateStatus` returns `true` (or is set to `null` 
* or `undefined`), the promise will be resolved; otherwise, the promise will be 
*/ rejected. 
validateStatus: function (status) { 

    return status >= 200 && status < 300; // default 
}, 

Sie könnten also eine Instanz mit Ihrer eigenen Konfiguration erstellen.

var instance = axios.create({ 

    validateStatus: function (status) { 

     return status == 200; 
    }, 
}); 

Sie können auch Standardeinstellungen festlegen. Diese werden auf jede Anfrage angewendet.

axios.defaults.validateStatus =() => { 

    return status == 200; 
}; 

UPDATE 1

Um die Konfiguration nur auf einen bestimmten Vorgang stellen Sie "config" mit den gewünschten Werten oder Methoden ersetzen könnten.

axios.post(url[, data[, config]]) 

UPDATE 2

Ich versuchte dies, aber es hat nicht funktioniert.

Sie können die Instanz nicht an axios.post() übergeben. Sie müssen den Post für die neue Instanz aufrufen.

var instance = axios.create({ 

    validateStatus: function (status) { 
     return status == 200; 
    } 
}); 

instance.post('url', data, config); 
1

Vielen Dank für Ihre Anregungen. Die Antwort war einfacher als ich erwartet hatte.

Ich wollte keine Standardoptionen festlegen, um das Verhalten von Axios zu ändern, also habe ich gerade etwas wie den Code unten versucht, und es hat funktioniert. Jedes Mal, wenn der Code throw new Error("Error"); ausgeführt wird, wird der catch-Blockcode danach ausgeführt.

axios.post('link-to-my-post-service', { 
     json-input 
    }).then(response => { 
     if (response.status === 200) { 
      //proceed... 
     } 
     else { 
      // throw error and go to catch block 
      throw new Error("Error"); 
     } 
    }).catch(error => { 
     //when throw "Error" is executed it runs the catch block code 
     console.log(error) 
    }); 
+0

Gern geschehen :) Warum willst du keine Standardoptionen einstellen? Oder erstellen Sie eine Instanz mit diesen Optionen? Benötigen Sie es nur mit einer bestimmten Anfrage?Meine Antwort wurde aktualisiert. –

+1

Danke nochmal für die Rückmeldung! Ich brauche es nur für eine bestimmte Anfrage – jenny

+0

Okaay. Wenn Sie es also nur für eine bestimmte Anfrage benötigen, können Sie es so machen, wie Sie es vorgeschlagen haben, oder sich "Update 1" in meiner Antwort ansehen. –

Verwandte Themen