Kĩ thuật promise trong knex?!



  • Sorry mọi người vì mình đặt cái tiêu đề không đúng lắm vì mình cũng ko biết phải gọi nó là gì. Vấn đề mình đang tò mò nó là thế này.

    Ví dụ mình có đoạn code sau:

    // require ...
    const state1 = knex('table').insert({col1: 'val1', coln: 'valn'}) // not execute
    const state2 = await knex('table').insert({col1: 'val1', coln: 'valn'}) // execute
    // do smt ...
    

    Ở đoạn code trên câu lệnh thứ nhất không được thực thi (kiểm tra db thì không có record mới), còn câu lệnh thứ 2 thì được thực thi (kiểm tra trong db thì thấy xuất hiện record mới). Search một hồi thì mình thấy khi nào có await hoặc được gọi các hàm then/catch/... thì nó mới chạy execute.

    Điều mình thắc mắc là knex dùng kĩ thuật gì để biết khi nào mình await/ gọi then/catch/... để nó execute. Bởi nếu đơn thuần trả về một promise thì câu lệnh vẫn được execute, chỉ là nếu không có await thì nó bỏ qua kết quả trả về mà thôi. Còn ở đây thì ko execute luôn.

    Nếu được mọi người có thể minh họa bằng một đoạn code ngắn thì tuyệt.

    Cảm ơn các cao thủ!


  • Global Moderator

    @vahaha said in Kĩ thuật promise trong knex?!:

    Ở đoạn code trên câu lệnh thứ nhất không được thực thi (kiểm tra db thì không có record mới), còn câu lệnh thứ 2 thì được thực thi (kiểm tra trong db thì thấy xuất hiện record mới). Search một hồi thì mình thấy khi nào có await hoặc được gọi các hàm then/catch/... thì nó mới chạy execute.

    Như trong nhóm fb đã trình bày, thì knex sử dụng kỹ thuật await một đối tượng thenable.

    Source: https://github.com/tgriesser/knex/blob/master/lib/interface.js#L12-L28

    Ví dụ khi await một thenable object:

    async function f2() {
      const thenable = {
        then: function(resolve, _reject) {
          resolve('resolved!')
        }
      };
      console.log(await thenable); // resolved!
    }
    
    f2();
    

    như vậy hàm knex('table').insert trả về một đối tượng (thenable object) có định nghĩa hàm .then(). Kết quả là chương trình execute câu lệnh sql mà knex biên dịch ra.


Log in to reply