Cải thiện JavaScript của bạn với sức mạnh của những lời hứa


Phạm Trung Chính
4 năm trước
Hữu ích 7 Chia sẻ Viết bình luận 0
Đã xem 4615

Bất cứ khi nào tôi xây dựng một cái gì đó, ngôn ngữ đầu tiên tôi tìm đến là JavaScript. Với tất cả các gói có sẵn trong Node.js, luôn có cách để hoàn thành công việc. Nhưng, giống như rất nhiều nhà phát triển. một trong những điều khiến tôi cảnh giác khi sử dụng JavaScript là gọi lại địa ngục. Mặc dù khá dễ dàng để tránh điều này, bằng cách sử dụng lời hứa. Thư viện tôi truy cập, cho dù trên trình duyệt hoặc trong ứng dụng Node.js là q.js   

Hãy xem một ví dụ. Giả sử bạn đang xây dựng một ứng dụng cần truy vấn cơ sở dữ liệu. Trước tiên, bạn cần kết nối với cơ sở dữ liệu và sau đó chạy truy vấn của bạn sau khi bạn biết rằng bạn đã kết nối. Cách tiếp cận JavaScript bình thường của Java đối với điều này sẽ sử dụng các cuộc gọi lại như sau: 

//this code assumes you’ve installed the mysql node package using npm install mysql

var mysql = require('mysql');

function connectAndQuery() {
        var connection = mysql.createConnection({
            host: ‘localhost',
            user: ‘user',
            password: ‘password',
            database: ‘mydb'
        });
        connection.connect(function(err) {
            if (err) {
                console.error('error connecting: ' + err.stack);
            }
            //now that we have a connection we can run the query
               var query = “select solution from mytable”;
               connection.query(query, function(err, rows, fields) {
            if (err) {
                console.log("Error: " + err);
            }

            console.log('The solution is: ', rows[0].solution);
            console.log("got results");

         });
     }


Nó ổn, nhưng nó rất tệ cho khả năng đọc. Hãy tưởng tượng những khó khăn trong một nhà phát triển mới gia nhập nhóm của bạn và hiểu mã này? Tất nhiên chúng ta có thể chia từng phần thành chức năng riêng của nó, nhưng vẫn còn rất nhiều công cụ gọi lại trong đó. Hãy làm cho mã chạy đồng bộ bằng Q. Bạn sẽ cần đưa q.js vào ứng dụng của mình. Đối với một ứng dụng nút, điều này được thực hiện bằng cách chạy 

npm install q —save

Với gói được cài đặt, bạn chỉ cần đưa thư viện vào mã của mình: 

var q = require(‘q’); 

Chúng tôi sẽ chia mã kết nối thành một chức năng riêng biệt. Có bốn bước chính mà bạn cần ghi nhớ để thêm lời hứa vào mã của mình: 

  1. Tạo một đối tượng hoãn lại bằng cách sử dụng q.

           var hoãn lại = q.defer ();

  2. Trả lại lời hứa khi kết thúc hàm  

           trả về deferred.promise; 

  3. Khi hàm của bạn sẵn sàng trả về một giá trị, hãy sử dụng hàm giải quyết và chuyển qua giá trị trả về dưới dạng tham số 

           deferred.resolve (result);

  4. Nếu bạn gặp phải một lỗi, bạn cần sử dụng chức năng từ chối để cho người gọi biết rằng đã xảy ra lỗi 

           deferred.reject (err);

Nó trông hơi xa lạ lúc đầu, nhưng được chia thành các bộ phận cấu thành của nó, nó có ý nghĩa. Bạn đang trả lại lời hứa cho người gọi, trong khi bạn sẽ giải quyết bằng tin tốt vào một thời điểm nào đó trong tương lai hoặc nếu không thì sẽ xảy ra lỗi.

function connect() {
        var deferred = q.defer();
        connection = mysql.createConnection({
            host: ‘localhost',
            user: ‘user',
            password: ‘password',
            database: ‘mydb'
        });
        connection.connect(function(err) {
            if (err) {
                console.error('error connecting: ' + err.stack);
                deferred.reject(err);
            }
            //console.log('connected as id ' + connection.threadId);
            deferred.resolve({});
        });
        return deferred.promise;
    }

Bây giờ hãy xem mã gọi, sẽ đợi cho đến khi kết nối được thiết lập trước khi tiếp tục. Nó thực hiện điều này bằng cách gọi hàm và sử dụng hàm .then () để thực hiện bước tiếp theo sau khi hoàn thành. Hàm then lấy một hàm làm tham số. Nếu lời hứa được giải quyết với bất kỳ dữ liệu nào (kết nối () không!) Thì bạn sẽ có quyền truy cập vào nó trong tham số dữ liệu. 

connect()
.then(function(data){
     //connection is now made, you can continue
});

Để bắt trường hợp lỗi, bạn chỉ cần thêm chức năng bắt tại bất kỳ điểm nào:

connect()
.then(function(data){
     //connection is now made, you can continue
})
.catch(function (error) {
    // Handle any error from all above steps
});

Tất nhiên lời hứa sẽ có ý nghĩa hơn khi có một chuỗi các sự kiện, vì vậy hãy xem xét việc tạo một truy vấn sau khi kết nối được thiết lập

Hãy thực hiện một truy vấn vào một hàm trả về một lời hứa 

function runQuery(query) {
        var deferred = q.defer();
        connection.query(query, function(err, rows, fields) {
            if (err) {
                console.log("Error: " + err);
                deferred.reject(err)
            }

            //console.log('The solution is: ', rows[0].solution);
            //console.log("got results");
            deferred.resolve(rows);
        });
        return deferred.promise;
    }

Bây giờ chúng ta có thể xâu chuỗi các chức năng như sau 

connect()
.then(function(data){
     //connection is now made, you can continue
     return runQuery(“select solution from mytable”);
})
.then(function(rows){
    console.log(“The query got “ + rows.length + “ results”);
})
.catch(function (error) {
    // Handle any error from all above steps
});

Như bạn có thể thấy, bạn chỉ cần trả lại lời hứa để giữ cho chuỗi hoạt động. 

Hàm bắt sẽ bắt bất kỳ sự từ chối nào từ tất cả các bước trước đó. 

Có một vài thủ thuật gọn gàng khác mà bạn có thể làm với Q.js, nhưng nếu bạn chưa quen với những lời hứa đó là đủ để bạn bắt đầu. 

Hữu ích 7 Chia sẻ Viết bình luận 0
Đã xem 4615