Anonystick

anonystick@gmail.com

Async error handling - Chia thành 4 loại (level nào cũng ok)

Async error handling với 4 cách xử lý này cho dù bạn là ai, level nào đi chăng nữa thì cũng dùng một trong những cách Async-Await, promises, javascript callback hay typescript callback.


Callback JavaScript


Những năm gần đây thì có lẽ các bạn mới vào chắc không có xài callback nữa? Lý do thì nhiều lắm, một trong những lý do đó là có thể bây giờ sử dụng Async-Await hay promises quá tốt rồi nên các bạn không bao giờ sử dụng callback. Mà nói thật callback quá phức tạp, hầu hết các lập trình viên không quen thuộc với nó, vì nó không được quản lý tốt về nhiều cái như error handling chẳng hạn. Giống như trên blog pouchdb.com đã từng nói: 

"And in fact, callbacks do something even more sinister: they deprive us of the stack, which is something we usually take for granted in programming languages. Writing code without a stack is a lot like driving a car without a brake pedal: you don’t realize how badly you need it until you reach for it and it’s not there. The whole point of promises is to give us back the language fundamentals we lost when we went async: return, throw, and the stack. But you have to know how to use promises correctly in order to take advantage of them."

Đại khái trên đó nói là việc sử dụng callback như một tình huống lái một chiếc xe mà không có phanh vậy. Nguy hiểm vãi, công nhận mấy ông Tây chửi thì kinh rồi. Sau đây thì viết nhanh gọn 4 tình huống giúp cho chúng ta Async error handling. Chúng tôi sẽ không giải thích nhiều nữa, vì đề tài này quá nhiều trong blog tipjs này rồi. Nếu chưa biết thì các bạn vào đó luyện công.


Using promises to catch errors


return functionA()
  .then(functionB)
  .then(functionC)
  .then(functionD)
  .catch((err) => logger.error(err))
  .then(alwaysExecuteThisFunction)

using async/await to catch errors

async function executeAsyncTask () {
  try {
    const valueA = await functionA();
    const valueB = await functionB(valueA);
    const valueC = await functionC(valueB);
    return await functionD(valueC);
  }
  catch (err) {
    logger.error(err);
  } finally {
    await alwaysExecuteThisFunction();
  }
}

using javascript callback style error handling

getData(someParameter, function(err, result) {
    if(err !== null) {
        // do something like calling the given callback function and pass the error
        getMoreData(a, function(err, result) {
            if(err !== null) {
                // do something like calling the given callback function and pass the error
                getMoreData(b, function(c) {
                    getMoreData(d, function(e) {
                        if(err !== null ) {
                            // you get the idea?
                        }
                    })
                });
            }
        });
    }
});

using Typescript callback style error handling

getData(someParameter, function(err: Error | null, resultA: ResultA) {
  if(err !== null) {
    // do something like calling the given callback function and pass the error
    getMoreData(resultA, function(err: Error | null, resultB: ResultB) {
      if(err !== null) {
        // do something like calling the given callback function and pass the error
        getMoreData(resultB, function(resultC: ResultC) {
          getMoreData(resultC, function(err: Error | null, d: ResultD) {
            if(err !== null) {
              // you get the idea?
            }
          })
        });
      }
    });
  }
});

Ref: 

anonystick 

medium