2017-03-07 2 views
0

Ich versuche, eine API zu überprüfen, wenn ein Bild es gültig ist. Ich mache es mit Versprechungen, ich möchte, dass, wenn eine Überprüfung der API mir einen Fehler zurückgibt, execute de versprechen stoppen und eine Funktion aufrufen.Stop oder Pause verspricht

Heres mein Code.

Meine Funktion die Versprechen

checkPhotos(options,formData, "front", res, false).then(function(response) { 
    if(response!== 'error'){ 
     options.url = 'http://'+config.verifier_host+':'+config.verifier_port+config.verifier_endpoint_sc; 
     readImage = fs.createReadStream("tmp/"+imgOne+".jpeg"); 
     formData = { 
      uuid   : request.uuid, 
      document_type : 1, //req.body.document_type 
      analysis_type : 1, 
      document_image: { 
       value: readImage, 
       options: { 
        filename: 'tmp/'+imgOne+'.jpeg', 
        contentType: null 
       } 
      } 
     }; 

     console.log("2a Ejecución") 
     return checkPhotos(options,formData, "back", res, false); 
    }else { 
     return; 
    } 
}).then(function(response) { 
    if(response!== 'error'){ 
     options.url = 'http://'+config.verifier_host+':'+config.verifier_port+config.verifier_endpoint_sc; 
     readImage = fs.createReadStream("tmp/"+nombreImagenBackimg2+".jpeg"); 
     formData = { 
      uuid   : request.uuid, 
      document_type : 1, //req.body.document_type 
      analysis_type : 2, 
      document_image: { 
       value: readImage, 
       options: { 
        filename: 'tmp/'+img2+'.jpeg', 
        contentType: null 
       } 
      } 
     }; 

     console.log("3a Ejecución") 
     return checkPhotos(options,formData, "back", res, false); 
    }else { 
     return; 
    } 
}).then(function(response) { 
    if(response!== 'error'){ 
     readImage = fs.createReadStream("tmp/"+nombreImagenSelfieimg3+".jpeg"); 
     formData = { 
      uuid  : request.uuid, 
      selfie_image: { 
       value: readImage, 
       options: { 
        filename: 'tmp/'+img3+'.jpeg', 
        contentType: null 
       } 
      } 
     }; 
     options.url = 'http://'+config.verifier_host+':'+config.verifier_port+config.verifier_endpoint_tc; 
     console.log("4a y última ejecución") 
     return checkPhotos(options, formData, null, res, true, request); 
    }else { 
     return; 
    } 
}).catch(function(err) { 
    logger.error('PID ' + process.pid + ' Error response' + err.message); 
    console.log("Catch -> "+ err.message); 
}); 

Meine Funktion Versprechen zu nennen.

function checkPhotos (options, formData, positionPhoto, res, bandera, request) { 
var promise = new Promise(function (resolve, reject) { 

    var post_req = requests.post({headers: {Authorization : options.headers.authorization}, url:options.url, formData: formData}, function (err, httpResponse, body) { 
     if (err) { 
      logger.error(' PID ' + process.pid + err); 
      return console.error('Error:', err); 
     } 

     if(!body){ 
      logger.error(' PID ' + process.pid + formData.document_image.options.filename); 
      return false; 
     } 

     responseBody = JSON.parse(body); 
     if(bandera){ 
      if(responseBody.success === 'error'){ 
       resolve(responseBody.success); 
       return getData(null, res, responseBody); 
      }else { 
       resolve(formData); 
       getData(null, res); 
      } 
     }else { 
      if(responseBody.success === 'error'){ 
       logger.error(' PID ' + process.pid + responseBody); 
       resolve(responseBody.success); 
       return getData(null, res, responseBody); 
      }else { 
       resolve(formData); 
       console.log("Success") 
      } 
     } 
    }); 
}); 

return promise; 

}

+0

Verwendung Beobachter statt. – Jai

+0

Wie @Jai sagte "Versprechen" kann nicht storniert werden, aber "Observable" kann storniert werden. –

Antwort

0

Anruf reject auf Fehler statt resolve. Auf diese Weise wird die Versprechungskette sofort zurückgewiesen und nachfolgende Aufrufe an .then werden nicht ausgeführt.

Wenn Sie die Versprechenskette innerhalb eines .then-Aufrufs stoppen möchten, können Sie einen Promise.reject(…)-Wert ODER einen Fehler zurückgeben.

Beispiel:

const promise = checkPhotos(...); 

promise 
.then(askApi) 
.then((response) => { throw response.body; }) 
.then(willNotBeExecuted) 
.catch(thisWillbeExecutedAfterThrow); 

function checkPhotos (options, formData, positionPhoto, res, bandera, request) { 
    return (resolve, reject) => { 
    // … make request 
    if (!bandera) { reject(getData); } 
    }; 
}