2016-10-18 33 views
-3

因为我在工作中使用异步。我将发送ajax请求,然后收到。如何处理异步的逻辑错误?

我会这样写。

const API = { 
    init() { 
    this.initIndexData(); 
    }, 

    async initIndexData() { 
    try { 
     let data = await this.getData(); 
    } catch (e) { 
     console.log(e); 
    } 
    }, 

    getData() { 
    new Promise((resolve, reject) => { 
     $.ajax({ 
     url: 'xx.json', 
     success(res) { 
      if (res.success) { 
      resolve(res); 
      } else { 
      reject(res); 
      } 
     } 
     }) 
    }); 
    } 
} 

API.init(); 

因为我不喜欢wirte代码try..catch。有没有解决方案来处理reject而不使用try catch

我想我可以随时使用reolve每当发生什么事情。喜欢这个。

if (res.success) { 
    resolve(res); 
} else { 
    reject(res); 
} 
... 

let data = await this.getData(); 
if (data.success) { 
    // do sth success logic 
} else { 
    // do sth error logic 
} 

以上是应对reject没有try catch的解决方案,但是这个代码是不是语义。

+1

“*我不喜欢用'try..catch' * WIRTE代码” - 为什么? – Bergi

+0

@Bergi我想当我使用try .. catch时,我不知道会发生什么错误。但在我写的例子中,你可以看到发生了什么错误,所以我认为没有必要使用try .. catch处理这个错误。 – qiuyuntao

+0

好吧,如果你只想捕捉'!res.success'的情况,那么也许你应该用'res'解决'并且把你想要处理的条件放在那里。如果出现网络问题,JSON语法错误或其他问题,您的承诺也会拒绝(并且“catch”会触发)。 – Bergi

回答

0

可以使用承诺的普通.catch method

async initIndexData() { 
    let data = await this.getData().catch(e => { 
    console.log(e); 
    }); 
}, 
async getData() { 
    const res = await $.ajax({ 
//   ^^^^^ much better than `new Promise` 
//     as it does not ignore the ajax error handler 
     url: 'xx.json', 
    }); 
    if (res.success) { 
    return res; 
    } else { 
    throw res; 
    } 
}