Javascript 如何在承诺函数中抛出不同的错误?
对于测试,我希望所有代码都被覆盖,并且我希望对于这个Promise函数中的每个步骤都拒绝不同的自写错误Javascript 如何在承诺函数中抛出不同的错误?,javascript,error-handling,promise,Javascript,Error Handling,Promise,对于测试,我希望所有代码都被覆盖,并且我希望对于这个Promise函数中的每个步骤都拒绝不同的自写错误 function convertToXML(b64DataPara) { return new Promise(function(resolve, reject) { var b64Data = b64DataPara; if(b64Data === '' || b64Data === undefined){ return reject(new Error
function convertToXML(b64DataPara) {
return new Promise(function(resolve, reject) {
var b64Data = b64DataPara;
if(b64Data === '' || b64Data === undefined){
return reject(new Error(errorMessages.B64Undefined));
}
if(typeof b64Data === 'number'){
return reject(new Error(errorMessages.StringNeededNotNumber));
}
// Decode base64 (convert ascii to binary)
var strData = atob(b64Data);
if (strData === undefined){
return reject(new Error(errorMessages.invalidCharacterInB64));
}
// Convert binary string to character-number array
var charData = strData.split('').map(function(x){return x.charCodeAt(0);});
// Turn number array into byte-array
var binData = new Uint8Array(charData);
// Decompress data
var data = pako.inflate(binData);
// Convert gunzipped byteArray back to ascii string:
var xmlData = String.fromCharCode.apply(null, new Uint16Array(data));
resolve(xmlData);
})
我有两个想法:
我觉得这两种想法都不专业。所以我想知道做这件事最好的/优雅的方式是什么。或者你认为所有的子步骤都应该在它自己的Promise函数中吗?目前你所有的代码都在Promise executor中。对我来说似乎不是很整洁-它可以工作,但它增加了额外的嵌套,这基本上是不相关的。您可以使函数
异步
,然后将拒绝(x)
转换为抛出
,将解析(x)
转换为返回x
。这将相当于你现在所做的,只是不需要在每件东西周围加上两组括号和一个缩进级别。谢谢你的回复。但是我可以这样调用函数吗?:const dataAsXml=await convertToXML('SomeBase64String)<代码>异步函数会自动将整个正文转换为承诺,并始终返回它。实际上,它是在做你手动做的事情。任何抛出的异常都将被拒绝,而返回将解决承诺。好的,我正在尝试重建并在stackblitz上进行q快速测试。我在代码中错了什么?Promise在控制台7上写入,而async函数写入未定义的代码:不需要任何其他代码-它已经返回了一个Promise。(将JSBin用作代码转储)。您的addInAsync
无法工作,因为它不返回任何内容-return
语句位于setTimeout
回调中。一般来说,您应该避免这样使用setTimeout
,因为与异步代码混合使用时会更加混乱。您可以像这样将其作为wait
函数进行提示,然后可以使addInPromise
和addInAsync
等效: