2016-10-18 57 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; 
    } 
}