2017-03-07 75 views
0

我想檢查一個API如果圖片它是有效的。我正在做承諾,我希望如果檢查API會讓我失敗,請停止執行承諾並調用函數。停止或休息的承諾

繼承人我的代碼。

我的函數調用的承諾

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); 
}); 

我的功能的承諾。

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; 

}上的錯誤,而不是resolve

+0

使用觀察員代替。 – Jai

+0

就像@Jai說'Promises'不能被取消,但'Observable'可以被取消。 –

回答

0

呼叫reject。通過這種方式,承諾鏈將立即被拒絕,並且任何後續對.then的調用都不會運行。

如果您想停止.then調用中的承諾鏈,則可以返回Promise.reject(…)值或拋出錯誤。

實施例:

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); } 
    }; 
}