Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In
Continue with Google
Continue with Facebook
or use


Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here
Continue with Google
Continue with Facebook
or use


Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.


Have an account? Sign In Now

Sorry, you do not have a permission to ask a question, You must login to ask question.

Continue with Google
Continue with Facebook
or use


Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

Stack Ask

Stack Ask Logo Stack Ask Logo

Stack Ask Navigation

  • Home
  • About Us
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • About Us
  • Contact Us
Home/ Questions/Q 1689
Next
Answered
Trần Quốc Đạt
  • 1
Trần Quốc ĐạtBeginner
Asked: September 18, 20212021-09-18T09:00:42+00:00 2021-09-18T09:00:42+00:00In: JavaScript

Promise có bất đồng bộ không?

  • 1

Hello anh! Em có đọc qua Bài viết về Single thread. Bài chia sẻ rất hay, nó làm em thay đổi cả suy nghĩ trước giờ về Promise.

Trước giờ em cứ nghĩ Promise nó rất thần kì, nó sẽ tự động đưa code bên trong constructor’s callback ra một “stack nào đó”, đợi đến khi main stack trống, event loop push ngược lại vào main stack như setTimeout, setInterval. hay nói đơn giản là biến code đồng bộ thành bất đồng bộ.

Ví dụ về Promise vẫn có thể xảy ra tình trạng blocking của anh rất hay, nó làm em nhận ra trước giờ mình đã sai về Promise. Nhưng em vẫn còn 1 điều thắc mắc: Promise có phải chỉ là một kiểu dữ liệu “wrapper” cho các service bất đồng bộ khác như WebApi, network,… bla bla và nó được viết thuần JS 100% (có nghĩa Promise vẫn là đồng bộ) không ạ? Lý do thì em nghĩ là để thay đổi cách viết bất đồng bộ bằng callback ngày xưa?

function runWithPromise() {
    let x = 0
    return new Promise(res => {
        while (x++ < 600_000_000);
            console.log(x)

        return res(x)
    })
}

async function runWithAsync() {
    let x = 0
    while (x++ < 600_000_000);
    console.log(x)
    return x
}

runWithAsync()
runWithPromise()

console.log('Finished')

asynccallbackpromise
  • 3 3 Answers
  • 173 Views
  • 0 Followers
  • 0
Answer
Share
  • Facebook
  • Report

3 Answers

  • Voted
  • Oldest
  • Recent
  1. Best Answer
    tvd12 Enlightened
    2021-09-18T09:27:58+00:00Added an answer on September 18, 2021 at 9:27 am
    This answer was edited.

    Đầu tiên, các code mà em viết trên javascript sẽ chạy trên main thread em ạ, nên code ở đây em cần viết rất gọn nhẹ. Còn về Promise thì theo anh đoán là nó sẽ giống kiểu đối tượng Future của java, mục tiêu của nó là lắng nghe kết quả trả về từ 1 thread khác. Await cũng sẽ tương đương với Future.get nó sẽ làm block cái thread đang chờ kết quả lại, trong trường hợp này Promise sẽ là đồng bộ. Tuy nhiên nếu em không dùng await thì không phải là đồng bộ mà chỉ có cái hàm callback của promise nó sẽ chạy trên main thread mới bị gọi là đồng bộ thôi em ạ.

    Tiếp theo, thực tế sẽ có 2 kiểu viết thư viện em ạ:

    1. Thư viện viết bằng javascript: Sẽ chạy trên main thread
    2. Thư viện viết bằng C/C++ hay các ngôn ngữ native, ví dụ anh đang viết: ezyfox-react-native-client-sdk thì việc xử lý I/O sẽ ở dưới background thread, và các sự kiện hay dữ liệu sẽ chuyển lên main thread thông qua main queue.

    Thế nên các thư viện I/O mà em đang dùng cũng sẽ phải viết kiểu đó em ạ, thì mới không làm block main thread và chương trình của em mới hoạt động bình thường được

    • 1
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report
  2. Trần Quốc Đạt Beginner
    2021-09-19T03:24:51+00:00Added an answer on September 19, 2021 at 3:24 am
    This answer was edited.

    Dạ em cảm ơn anh Dũng đã giải đáp, em xin tổng hợp lại những gì mình hiểu xem có đúng không ạ:

    • Promise là một đối tượng, cung cấp một cách thức để “Lắng nghe” kết quả trả về từ 1 thread khác – Cũng như ngày xưa người ta dùng callback để “Lắng nghe”.
    • Promise chỉ bất đồng bộ khi trả kết quả về (kết quả truyền vào cho hàm resolve) chứ không phải bất đồng bộ khi execute hàm callback (executor).
    • Tương tự như vậy, await đang “đợi/lắng nghe”  kết quả của Promise chứ không phải đợi executor, bởi executor đã được thực thi trong khi tạo promise rồi.
    • Do vậy dùng Promise thuần để bất đồng bộ một task nặng là sai, do Promise thuần không có khả năng đó. Phải dùng kết hợp với những API hỗ trợ bất đồng bộ khác như setTimeout, setInterval,… để không gây block main thread.
    • 1
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report
    • tvd12 Enlightened
      2021-09-19T04:07:17+00:00Replied to answer on September 19, 2021 at 4:07 am
      This answer was edited.

      Đúng thế em ạ, muốn thực sự có đồng bộ, là em phải code tầng dưới, tầng C/C++ hay các tầng native tương ứng với hệ điều hành em ạ, chứ còn các đối tượng trên javascript chỉ có khả năng gửi sự kiện, dữ liệu từ main thread xuống các luồng ở dưới, và sau đó nhận kết quả ở callback em ạ.

      Riêng ý cuối thì chỉ là làm tạm thời không làm block main thread thôi em ạ, chứ cuối cùng thì nó vẫn cứ chạy cái callback ở main thread, và em mà code xử lý nặng ở đây nó vẫn sẽ làm block chương trình. Em có thể thử dụng while(true) ở các hàm callback xem sao nhé.

      • 1
      • Share
        Share
        • Share on Facebook
        • Share on Twitter
        • Share on LinkedIn
        • Share on WhatsApp
        • Report

You must login to add an answer.

Continue with Google
Continue with Facebook
or use


Forgot Password?

Need An Account, Sign Up Here

Sidebar

Ask A Question

Stats

  • Questions 826
  • Answers 1k
  • Best Answers 80
  • Users 337
  • Popular
  • Answers
  • monkey

    [Deep Learning] Làm thế nào để xác định được cái ...

    • 16 Answers
  • Thành Vương

    Bug sai đường dẫn khi config ckeditor lên live

    • 14 Answers
  • Tú Trần Anh

    [Ezyfox Server] Unity game client không gửi được command khi ...

    • 12 Answers
  • tvd12
    tvd12 added an answer 1. Anh không hiểu tại sao em lại cần phải… February 4, 2023 at 7:50 am
  • tvd12
    tvd12 added an answer Cái này anh thấy là em đang gửi dữ liệu… February 4, 2023 at 7:46 am
  • monkey
    monkey added an answer Đây em: class Event{} class Room{} class EventRoom{eventId, roomId} February 2, 2023 at 9:07 am

Related Questions

  • monkey

    Javascript: Cách viết dấu ... trong trường hợp này là ...

    • 1 Answer
  • Nguyễn Hữu Cường

    Valid email regex pattern

    • 3 Answers
  • tvd12

    Tạo QR code cho thông tin tài khoản ngân hàng ...

    • 1 Answer

Top Members

tvd12

tvd12

  • 76 Questions
  • 1k Points
Enlightened
monkey

monkey

  • 122 Questions
  • 1k Points
Enlightened
Nguyễn Thái Sơn

Nguyễn Thái Sơn

  • 205 Questions
  • 307 Points
Enlightened

Trending Tags

#formatdate .net .net core .net oop abstract class access app access token ai analytics android ansible anti-flooding apache poi api app architecture artificial intelligence assembly async asyncawait atomicboolean authentication backend backend nestjs background bash script batch bean big project binding bitcoin blockchain blog boot-nodes branch british btree bucket4j buffered build bundle c# c# .net cache caching callback career career path cast centos chat cloud cloud reliability commit communication company computer science concurrent config-css connection pool content-disposition contract convert date to number cookie cors cosmos cosmos-sdk crawl data cron css database database migration datasource datastructure deadlock decentralized exchange deep learning deploy contract design-pattern design patterns devops dex di distraction programing dns docker download draw.io du học duration dữ liệu lớn eclip editor elasticsearch email employee english erc20 erc721 estimation eth ethereum ethereum login excel exception exception handle exception handler executor export compliance extensions exyfox ezyfox ezyfox-boot ezyfox-server ezyfoxserver ezyhttp ezymq-kafka ezyredis facebook fe filter floating point flutter format json freetank french front-end frontend fullstack fulltextsearch future gallery game game-box game-room game-server gateway get get file zip git glide go golang google gorilla graduation thesis graphql grapql grpc guide h2 database handy terminal hazelcast hibernate hibernateconfig html http https hyperloglog image index indexing integration-test intellij interface interview io ioc ipfs isolate issue it java java core javacore javascript java spring javaw java web jenkins jetbrains job join jotform jpa js json json file jsonproperty json to object jsp jsp & servlet junit-test jvm jwt kafka keep promise kerberos keycloak kotlin language languague library list load-balancing load balancer lock log log4j log4j-core login lưu trữ machine learning macos mail mail template main maria db math maven merge message queue messaging metamask microservice microservices migration mobile model mongo monitoring mq msgpack multi-threading multiple tenant multithread multithreading mysql n naming naming convention nan netcore netty networking nft nft game nginx nio node.js nodejs non-blocking io null oop opensource optimize oracle orm otp message paginaiton pagination pancakeswap panic partition pdf pgpool phỏng vấn plugin pointer postgresql postman pre private_key procedure profile programming project management promise properties push-noti push message android push notification python python unicode qrcode question queue rabbitmq reactive reactjs reactjs download readmoretextview recyclerview redis refactor refresh token regex replica repository request resilence4j resource rest resttemplate roadmap ropssten ropsten round robin rust rxjava s3 schedule scheduled scheduled spring boot search security send email send mail server servlet session shift jis singleton sjis slack smart contract soap socket socket server soft delete solution sosanh spring spring-boot-test spring-jpa spring aop springboot spring boot spring data jpa spring redis springsecurity spring security springwebflux mysql spring websocket spring websocket cors sql sql server sse ssl email stackask storage stream stream api stress test structure trong spring boot study synchronize synchronized system environment variables test thread threadjava threadpool thread pool thymeleaf tomcat totp tracking location transaction transfer transfer git udp uniswap unit test unity upload upload file utf-8 file validate validate date vector view volatile vue vue cli watermark web web3 web3 client webassembly webflux webpack websocket windows 11 winforms work zip file zookeeper

Footer

Stack Ask

Stack Ask is where Developers Ask & Answers. It will help you resolve any questions and connect you with other people.

About Us

  • Meet The Team
  • About Us
  • Contact Us

Legal Stuff

  • Terms of Service
  • Privacy Policy
  • Cookie Policy

Help

Follow

© 2021 Stack Ask. All Rights Reserved
Powered by youngmonkeys.org