Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在承诺函数中抛出不同的错误?_Javascript_Error Handling_Promise - Fatal编程技术网

Javascript 如何在承诺函数中抛出不同的错误?

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

对于测试,我希望所有代码都被覆盖,并且我希望对于这个Promise函数中的每个步骤都拒绝不同的自写错误

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

})
我有两个想法:

  • 用if/else将每个步骤包装起来
  • 将所有代码放在Promise函数中的try-catch中,并在catch块中处理所有错误以及if-else等

  • 我觉得这两种想法都不专业。所以我想知道做这件事最好的/优雅的方式是什么。或者你认为所有的子步骤都应该在它自己的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
    等效: