Vietnam

    Nodejs.vn

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Popular
    • Tags
    • Groups
    • Search

    Kĩ thuật promise trong knex?!

    Hỏi Đáp
    2
    2
    237
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • vahaha
      vahaha last edited by

      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ủ!

      • . ^
      Vũ 1 Reply Last reply Reply Quote 0
      • Vũ
        Vũ Global Moderator @vahaha last edited by

        @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.

        • Tham khảo: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await

        Tech-nông
        Email: [email protected]
        Profile: about.me/vunb
        Github: github.com/vunb
        Twitter: twitter.com/nhubaovu

        1 Reply Last reply Reply Quote 0
        • First post
          Last post