Cuộc gọi lại khác nhau cho lỗi hoặc lỗi như đối số đầu tiên?


12

Chúng tôi (và phòng trò chuyện JS SO) đã nói chuyện với @rlemon vài ngày trước về thư viện Little-XHR của anh ấy về việc xử lý lỗi.

Về cơ bản, chúng tôi muốn quyết định nên sử dụng mẫu xử lý lỗi nào:

xhr.get({
    // Some parameters, and then
    success: function(data) {},
    failure: function(data) {}
})

Hoặc là:

xhr.get({
    // Some parameters, and then
    callback: function(err, data) {}
})

Một cái giống với jQuery hơn, trong khi cái kia giống Node hơn. Một số người nói rằng mẫu đầu tiên khiến bạn suy nghĩ nhiều hơn về việc xử lý lỗi. Tôi nghĩ ngược lại, vì bạn có thể quên hàm gọi lại khác, trong khi đối số luôn ở đó trên mẫu thứ hai.

Bất kỳ ý kiến ​​/ lợi thế / nhược điểm về cả hai mô hình này?


xhr.get({ ... }, function (err, data) {})Ít nhất là lấy đúng mẫu
Raynos

Câu trả lời:


5

Tính năng thực sự quan trọng là tính nhất quán về kiểu dáng để bạn có thể viết mã theo cùng một kiểu và bạn có thể đưa ra các giả định lập trình meta về cách xử lý các tình huống không đồng bộ.

Cá nhân tôi thích

(err, data)bởi vì đó là một cách xử lý tiêu chuẩn. Nó cho phép thành phần chức năng.

Ví dụ after.mapsử dụng mô hình này. Mã như thế

after.map(["foo.js", "bar.js"], function (fileName, callback) {
    fs.readFile(fileName, function (err, file) {
        callback(err, file)
    })
}, function (err, files) {
    // handle files
})

có thể được đơn giản hóa để

after.map(["foo.js", "bar.js", fs.readFile, function (err, files) {
    // handle files
})

Một lợi thế khác là bạn có thể chuyển trong một cuộc gọi lại như là một tham số cuối cùng

asyncOperation(options, function (err, data) {
    // not nested inside an object literal
})

Cách tiếp cận gọi lại cuối cùng là một cách tiếp cận quen thuộc API.

Một lợi thế nữa là bạn có thể dễ dàng quên đặt errortrình xử lý theo nghĩa đen của đối tượng hoặc đặt nó thành một loại trình xử lý lỗi mặc định.

Khi bạn sử dụng (err, data)nó nhắc nhở bạn nghĩ về cách xử lý hiệu quả lỗi này mỗi lần.


2

Nói chung, tôi muốn nhớ rằng rõ ràng luôn luôn tốt hơn ngầm.

Sử dụng điều này, tôi thường phụ với các chức năng successvà rõ ràng failure- bạn biết chính xác những gì bạn đang xử lý ngay khi bạn mở mã đó - giao dịch thành công đã kết thúc thành công, trong khi lỗi xử lý các cuộc gọi có vấn đề.

Cách khác, sử dụng một phương thức duy nhất, sẽ mất nhiều thời gian hơn để đọc khi bạn sửa đổi mã đó. Bên cạnh đó, bạn có khả năng sẽ kết thúc với một cái gì đó như thế này;

xhr.get({
    callback: function(err, data) {
        if (err) {
            // handle that error somehow
        }
        else {
            // deal with success somehow
        }
    }
})

Và loại nồi hơi đó trở nên nhàm chán, nhanh chóng.

Chưa kể, nếu bạn quên thêm bản tóm tắt này, và ví dụ, bạn chỉ xử lý thành công, thì một nhà phát triển mới nhập cơ sở mã có thể không thấy vấn đề với nó. Nhưng có lỗi gọi lại / gọi lại thành công rõ ràng, họ có thể thấy khá nhanh rằng bạn đang thiếu một errorcuộc gọi lại và bắt đầu làm việc để xử lý nó, hoặc ít nhất là tìm ra "tốt, đây chỉ là xử lý thành công - tôi phải tìm cách xử lý lỗi ". Nó làm cho mã có vẻ ít ma thuật hơn.


Thật khó để thấy bạn thiếu một cuộc gọi lại lỗi và dễ dàng hơn để thấy bạn không xử lý errtham số đầu tiên
Raynos

1

Gọi lại riêng

Nếu xhr.get()cuộc gọi thành công, thì errlà dư thừa. Nếu cuộc gọi thất bại. datalà dư thừa. Thay vì buộc mã khách hàng kiểm tra trạng thái của cái này hay cái kia, đừng vượt qua cả hai.

Nếu hóa ra thành công có thể đại diện cho một phần thành công, hãy chỉ ra điều đó một cách riêng biệt. Thất bại thường là lựa chọn bảo lãnh.

Tôi đã làm việc với các nhà phát triển chỉ xử lý trường hợp thành công và trong nhiều tình huống chỉ cần thực hiện gọi lại thành công là đủ trong trường hợp này. Một cuộc gọi lại đa trạng thái sẽ là lựa chọn thảm khốc cho phong cách lập trình đó khi họ cho rằng thành công.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.