如何使用await函数保存变量并在发生错误时使用回调?

时间:2017-04-03 01:19:22

标签: javascript node.js asynchronous request async-await

我正在将我的代码移植到ES7,像arrow函数和async / await这样的语法。问题是当我尝试使用async/await同时发生错误时尝试保存变量和回调时,我不知道如何使用回调。

这是代码。我想使用带有rp的await将请求的结果保存到redditJSON变量,但我也想为错误处理添加回调。但我不知道如何实现这一点。

rp是请求承诺npm模块。

let redditJSON = await rp(optForReddit)

编辑1

let redditJSON;
try { redditJSON = await rp(optForReddit) }
catch(err) { console.error(err) }

3 个答案:

答案 0 :(得分:1)

创建一个公共包装函数,或者安装await-promise-wrapper:

当等待退出时,如果发生错误,则没有像我们在基于承诺的实现中那样的捕获

<强> // wrapper.js

export default function forActivity(promise){
   return promise
       .then( result => [null,result])
       .catch(err => [err])
}

// yourFile.js

import forActivity from wrapper.js
const [err, redditJSON] = await forActivity(rp(optForReddit));
if(err) console.log("error");

答案 1 :(得分:0)

回调在ES7中已经失效,不应再使用了。要使用新的异步等待模式执行错误处理,您应该将调用包装在try / catch块中。

看起来应该是这样的:

try {
   let redditJSON = await rp(optForReddit);
   // do some cool stuff
} catch(err) {
    console.log(err);
    // The contents of err should be what is thrown in the rp function
}

如果您使用诸如request-promise之类的库来执行此请求,则应该自动抛出错误并抛出此try / catch块。

但是,请记住,您也可以自己抛出错误,例如:

async myMethod() {
    throw new Error('something went wrong');
}

然后像这样抓住它:

try {
    await myMethod()
} catch (err) {
    // err = 'Something went wrong'
}

答案 2 :(得分:0)

您不需要保存临时变量,因为如果您将其设置为catch块,它将永远不会有值。

在Paul发布的简单版本中,如果你点击catch块,reddittJSON将是未定义的,所以如果需要,你可以随时检查。

现在最新的承诺和等待的很酷的事情是你可以设置许多进程异步进行,然后再进行同步。

try {
    let promise1 = rp(longCall).promise();
    let promise2 = rp(longCall2).promise();

    let [response1, response2] = await Promise.all([promise1, promise2]);
} catch (error) {
    console.log(error);
}
// response1 and response2 will be undefined here if there was an error

请阅读此处了解更多信息。 http://javascriptrambling.blogspot.com/2017/04/to-promised-land-with-asyncawait-and.html

在Java编程超过20年之后,我对javascript在过去几年取得的巨大飞跃感到非常兴奋。