async / await - 尝试...捕获$ .when

时间:2018-02-16 18:41:38

标签: javascript vue.js async-await try-catch

我正在处理一个小型项目,需要对各种API端点进行多次AJAX调用。前三个需要相互连续的数据,后三个可以独立运行,因为它们与前三个没有任何关系。

这是我第一次主要涉及async / await,并且实际上将promises用于其预期目的,并且我对如何处理任何异常感到困惑。我们正在使用Vue.js作为我们的前端框架并使用JSON响应。

我用这个函数调用包含我的请求的函数:

fetchAllData: async function() {
    await this.getList()
    await this.getSecondListRelatedToFirst()
    await this.getThirdListRelatedToFirstAndSecond()
    this.getDateRange()
    getConversions()
    getVolumes()
}

请求现在如何运行:

this.getList()
|------------> this.getSecondListRelatedToFirst()
              |----------> this.getThirdListRelatedToFirstAndSecond()
              |------> this.getDateRange()
              |------> getConversions()
              |------> getVolumes()
运行

this.getList(),然后this.getSecondListRelatedToFirst()this.getList()结算时运行,最后四个在this.getSecondListRelatedToFirst()结算时运行。

请求的结构与此非常类似:

getList: function () {
    return $.ajax({
        type: "GET",
        url: '/api/endpoint',
        dataType: 'json',
        data: {
            param_one  : param_one,
            param_two  : param_two,
            param_three: param_three,
            ...
        }
    })
    .then(function(data, status, xhr) {
         let temp = _.map(data, function (d) {
             return {
                 // map some data here         
             }
         }.bind(this));

    }, function(jqXhr, textStatus, errorThrown) {
                console.error(errorThrown);
    })
    .catch(function(error){
         console.log.bind(error)
})

基本的想法是,一旦响应从服务器返回,我将数据操作为更容易被Vue消费的内容,并随着呈现页面一起移动。

转到第一个函数fetchAllData,在mounted生命周期属性中调用,如下所示:

$.when( this.fetchAllData() )
 .then( function() {
    // do some other stuff
 })
 .fail(
      console.log.bind(console);
 );

这就是我的问题所在。考虑到我在AJAX级别上执行错误捕获(使用then,catch块),我是否还需要在此处执行错误捕获?如果是这样,我将如何在$.when块中实现这一目标?或者最终的fail声明在执行的这一点上是否足够?

这个问题可能是一个阅读方式太多的用例以及对Vue.js和async / await的经验不足的情况,我只需要对这类场景的最佳实践进行一些澄清。谢谢你的指导!

1 个答案:

答案 0 :(得分:1)

我认为您需要查看MDN documentation

var response = await promisedFunction().catch((err) => { console.log(err); });
// response will be undefined if the promise is rejected

也许它会回答你的问题。