優秀的東西 就要學習和借鑑 上代碼
// 第一代
function aa() {
return new Promise(function (resolve,reject) {
var key = Math.floor(Math.random()*10)
if(key>4){
resolve(111)
}else{
reject(222)
}
})
}
async function bb() {
var res = await aa()
console.info(res)
}
bb()
我模擬了 一個 利用promise 處理異步方法的 例子 這裏 會隨機返回正常的data 還是 報錯
正常的圖
報錯的圖
這裏如果利用try catch 包裹 代碼會比較臃腫
借鑑了別人的文章 代碼可以稍作修飾 地址 https://blog.csdn.net/q3254421/article/details/88878288
function aa() {
return new Promise(function (resolve,reject) {
var key = Math.floor(Math.random()*10)
if(key>4){
resolve(111)
}else{
reject(222)
}
})
}
async function bb() {
var res = await aa().then(data => data).catch(err=>err)
console.info(res)
}
bb()
結果截圖
可以看到 此時的報錯已經不需要try catch的處理 不過 正確的還好 如果報錯 res 就是報錯的值 這樣無法區分 結果的對錯了
function aa() {
return new Promise(function (resolve,reject) {
var key = Math.floor(Math.random()*10)
if(key>4){
resolve(111)
}else{
reject(222)
}
})
}
async function bb() {
const [err, data] = await aa().then(data => [null, data] ).catch(err => [err, null])
console.info(err)
console.info(data)
}
bb()
這次就把 error 和data 進行了區分了
然後 我們將 aa的一長傳代碼二次封裝一下
function aa() {
return new Promise(function (resolve,reject) {
var key = Math.floor(Math.random()*10)
if(key>4){
resolve(111)
}else{
reject(222)
}
})
}
function to(callback) {
return callback.then(data => [null, data] ).catch(err => [err, null])
}
async function bb() {
const [err, data] = await to(aa())
console.info(err)
console.info(data)
}
bb()
運行結果是相同的 所以 我們 只是對 返回promise的方法進行了二次封裝 爲什麼叫 to 呢 因爲 這個東西已經有人封裝好了啊
而且名字 就是 to.js 哈哈 地址 https://blog.grossman.io/how-to-write-async-await-without-try-catch-blocks-in-javascript/
下載指令
npm i await-to-js
使用
import to from './to.js';
async function asyncTask() {
let err, user, savedTask;
[err, user] = await to(UserModel.findById(1));
if(!user) throw new CustomerError('No user found');
[err, savedTask] = await to(TaskModel({userId: user.id, name: 'Demo Task'}));
if(err) throw new CustomError('Error occurred while saving task');
if(user.notificationsEnabled) {
const [err] = await to(NotificationService.sendNotification(user.id, 'Task Created'));
if (err) console.error('Just log the error and continue flow');
}
}