Javascript 节点:未处理的承诺拒绝
我正在参加一个关于异步编程的js/node研讨会,名为promise it't Won That hurt。我有以下练习: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)
- 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 Notry
/捕获
在新承诺执行者中是必要的。这部分练习没有意义。请参见编辑:@user1592380您必须在promise处理中添加catch块,该函数使用catch返回promise,并更新答案
function parsePromised(json) {
try {
return Promise.resolve( JSON.parse(json) );
} catch(thrownError) {
return Promise.reject(thrownError);
}
}