Javascript 节点:未处理的承诺拒绝

Javascript 节点:未处理的承诺拒绝,javascript,node.js,promise,Javascript,Node.js,Promise,我正在参加一个关于异步编程的js/node研讨会,名为promise it't Won That hurt。我有以下练习: process.argv[2]上将提供一些无效的JSON 构建一个名为parsePromised的函数,该函数创建承诺,执行 JSON.parse在try/catch块中,根据是否抛出错误来实现或拒绝承诺注意:您的函数应该同步返回承诺 构建一系列步骤,如上图所示,捕获所有抛出的错误并将其记录到控制台 我的答覆是: function parsePromised(json)

我正在参加一个关于异步编程的js/node研讨会,名为promise it't Won That hurt。我有以下练习:

  • process.argv[2]上将提供一些无效的JSON
  • 构建一个名为
    parsePromised
    的函数,该函数创建承诺,执行
  • JSON.parse
    try
    /
    catch
    块中,根据是否抛出错误来实现或拒绝承诺注意:您的函数应该同步返回承诺
  • 构建一系列步骤,如上图所示,捕获所有抛出的错误并将其记录到控制台
我的答覆是:

function parsePromised(json) {
  return new Promise(function(resolve, reject){
      resolve( JSON.parse(json) ),
      reject(throwError)
  });

}

parsePromised(process.argv[2]).then(console.log);
堆栈跟踪是:

(node:3499) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token u in JSON at position 0
at JSON.parse (<anonymous>)
at /home/optionhomes11/nodeprojects/promise-shop/test.js:184:21
at new Promise (<anonymous>)
at parsePromised (/home/optionhomes11/nodeprojects/promise-shop/test.js:183:10)
你知道怎么让它工作吗

在应答中更改为“代码”后,堆栈跟踪:

(node:5533) UnhandledPromiseRejectionWarning: SyntaxError: 
 Unexpected token u in JSON at position 0
at JSON.parse (<anonymous>)
at /home/optionhomes11/nodeprojects/promise-shop/test.js:186:34
at new Promise (<anonymous>)
at parsePromised (/home/optionhomes11/nodeprojects/promise-shop/test.js:184:10)
at Object.<anonymous> (/home/optionhomes11/nodeprojects/promise-shop/test.js:196:1)
at Module._compile (internal/modules/cjs/loader.js:999:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
at Module.load (internal/modules/cjs/loader.js:863:32)
at Function.Module._load (internal/modules/cjs/loader.js:708:14)
at Function.executeUserEntryPoint [as runMain] 
(internal/modules/run_main.js:60:12)
(node:5533) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(节点:5533)未处理的PromisejectionWarning:SyntaxError:
JSON中位置0处的意外标记u
在JSON.parse()处
at/home/optionhome11/nodeprojects/promise shop/test.js:186:34
在新的承诺()
在parsePromised(/home/optionhomes11/nodeprojects/promise shop/test.js:184:10)
反对。(/home/optionhome11/nodeprojects/promise shop/test.js:196:1)
at模块编译(内部/modules/cjs/loader.js:999:30)
在Object.Module._extensions..js(internal/modules/cjs/loader.js:1027:10)
在Module.load(内部/modules/cjs/loader.js:863:32)
at Function.Module._load(内部/modules/cjs/loader.js:708:14)
在Function.executeUserEntryPoint[作为runMain]
(内部/modules/run_main.js:60:12)
(节点:5533)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用CLI标志“---unhandled rejections=strict”(请参阅https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (拒绝id:2)

根据您提到的说明,我认为您希望这样做

function parsePromised(json) {
  return new Promise(function(resolve, reject){
     try {
         const parsedJson = JSON.parse(json);
         resolve(parsedJson);
     } catch(error) {
        // we reach in this block if we encounter error while parsing some invalid given json
        reject(error);
        //or reject(error.message);
     }
  });
}
现在你这样称呼它

parsePromised(process.argv[2])
    .then(console.log)
    .catch(function(err) {
        console.log("some error occured while parsing the json");
        console.log("error is:", err.message);
    });

基本上,无论您在promise中拒绝了什么,当您试图获得promise结果时,都会得到更高阶的函数。

您就快到了,只是错过了最后一步:

构建一系列步骤,如上图所示,捕获所有抛出的错误并将其记录到控制台

只有当结果不是错误时,才记录该结果。换成

parsePromised(process.argv[2]).catch(console.log);
//                             ^^^^^
还要注意,您不需要显式调用
reject
-。所以你需要做的就是

function parsePromised(json) {
  return new Promise(function(resolve, reject){
    resolve( JSON.parse(json) )
  });
}
如果你想自己捕捉错误,你宁愿写

function parsePromised(json) {
  try {
    return Promise.resolve( JSON.parse(json) );
  } catch(thrownError) {
    return Promise.reject(thrownError);
  }
}

看看Promise中的函数应该是什么样子,为了给您一个提示,您需要编写一个try块,在其中解析JSON并使用该JSON调用
resolve
。在catch块中,如果解析失败,则调用
reject
,并返回
错误
重读步骤#3。你应该在
try
blockWell中解析JSON并解析承诺。那么,你的try/catch块是什么?这是你贴在这里的说明!然后只捕获已解决的案例,让我们将其与
链接。捕获
@Faust No
try
/
捕获
新承诺执行者中是必要的。这部分练习没有意义。请参见编辑:@user1592380您必须在promise处理中添加catch块,该函数使用catch返回promise,并更新答案
function parsePromised(json) {
  try {
    return Promise.resolve( JSON.parse(json) );
  } catch(thrownError) {
    return Promise.reject(thrownError);
  }
}