2017-06-02 4 views
0

Der Code funktioniert, aber ich frage mich, ob ich über vielversprechende bin.Bin ich über mit dem folgenden Code versprechen?

Ich habe diese Redux Aktion

import Promise from 'bluebird'; 
const uploadAsynch = Promise.promisify(api.upload); 

uploadFiles : function(data, dispatch){ 
    var data = { 
     ep:"EP_UPLOAD", 
     payload: { 
     files: data.files, 
     profile: data.profile 
     } 
    } 
    uploadAsynch(data).then((result)=>{ 
     dispatch({type: FILES_UPLOADED}) 
    }); 
    }, 

api.upload ist die folgende

import axios from 'axios'; 

upload : function(data, callback){ 
    var files = new FormData(); 
    for(var i=0; i<data.payload.files.length; i++){ 
     files.append('files', data.payload.files[i], data.payload.files[i].name); 
    } 
    axios.post(apiEndpoints[data.ep], files, { 
     headers: { 
     'accept': 'application/json', 
     'Accept-Language': 'en-US,en;q=0.8', 
     'Content-Type': `multipart/form-data; boundary=--*`, 
     } 
    }) 
    .then((response) => { 
     callback(null, response) 
    }).catch((error) => { 
     callback(error) 
    }); 
    }, 

So frage ich mich. Wenn Axios ein auf Versprechen basierender Anforderungs-Client ist, ist es richtig, ihn mit bluebird in der Aktion zu verpacken?

+0

Was meinst du mit * * über viel versprechend? Brauchen Sie wirklich "Upload", um Callback-basiert zu sein? – Ryan

+0

Das ist, was ich frage ... Sollte es nur eine Rückkehr sein und dann mit einem Schalter diese Antwort behandeln? – Ando

+0

Nicht sicher, was Sie mit "mit einem Schalter" entweder meinen. Wenn Sie nicht möchten, dass Ihr 'api.upload' Callback-basiert ist, ist es wahrscheinlich am besten, wenn Sie nur ein Versprechen abgeben, ja. – Ryan

Antwort

0

Ich würde sagen, Sie sind unterversprechend, weil Sie Versprechen nicht in vollem Umfang nutzen. Sie greifen jedoch auf Callbacks zurück und promi- tieren gleichzeitig diese Funktion erneut, was ziemlich sinnlos ist. Nur return das Versprechen, das Sie in erster Linie hatten.

// no promisification 
uploadFiles: function(data, dispatch){ 
    var data = { 
    ep:"EP_UPLOAD", 
    payload: { 
     files: data.files, 
     profile: data.profile 
    } 
    } 
    return api.upload(data).then(result => 
//^^^^^^ 
    dispatch({type: FILES_UPLOADED}) 
); 
} 

import axios from 'axios'; 

upload: function(data) { // no callback 
    var files = new FormData(); 
    for (var i=0; i<data.payload.files.length; i++){ 
    files.append('files', data.payload.files[i], data.payload.files[i].name); 
    } 
    return axios.post(apiEndpoints[data.ep], files, { 
//^^^^^^ 
    headers: { 
     'accept': 'application/json', 
     'Accept-Language': 'en-US,en;q=0.8', 
     'Content-Type': `multipart/form-data; boundary=--*`, 
    } 
    }); 
} 
+0

v interessant. Ich dachte, dass die Kette eines Versprechens damit verbunden ist, aber von deinem Beispiel, das funktioniert, scheint es, als könnte ich die Kette eine Ebene höher anwenden (von wo aus ich das Versprechen nenne). Ist das richtig zu sagen? Danke für die Antwort. – Ando

+0

Ich bin mir nicht sicher, was "die Kette eines Versprechens" für Sie bedeutet. Eine Kette besteht immer aus * multiplen * Versprechen und kann nicht an etwas "gebunden" werden. Wie ['dann' neue Versprechen abgibt (https://stackoverflow.com/a/22562045/1048572) ist die wahre Magie - und ja, Versprechungen sind * Werte *, die herumgereicht werden können und von Funktionen zurückgegeben werden Wie bei jedem anderen ist es auch egal, wann/wo/ob die Methode '.then()' aufgerufen wird. – Bergi

+0

Danke für den Link. Ich werde mehr über sie erfahren. – Ando

Verwandte Themen