nodejs / nodejs/node

Odd behavior with asynchronous console I/O in REPL

Đang mở
#43,074 1 bình luận 1 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

confirmed-bug repl
Ngôn ngữ chính
JavaScript
Star
122k
Fork
37.3k
Merge trung bình
4 ngày 2 giờ
Pull request đã merge (30 ngày)
283

Mô tả

Version

v16.15.0

Platform

Microsoft Windows NT 10.0.19044.0 x64

Subsystem

No response

What steps will reproduce the bug?
  1. Open the REPL.
  2. Run setTimeout(() => console.log('h'), 1000) and wait for the timer to expire. The letter h will print where the cursor was, and push the cursor down to the line after the prompt.
  3. Type another letter which results in autofill, such as g. This already looks somewhat broken, with the letter appearing a few columns to the left of the cursor.
  4. Hit tab to autofill. This is even more broken, as autofill picks up from the cursor rather than from the first letter.
  5. Hit backspace and watch the word magically fix itself, with a new prompt in the same line as the cursor.
How often does it reproduce? Is there a required condition?

It always occurs when console.log is called asynchronously after the prompt is rendered. process.stdout.write also has somewhat odd behavior, but is noticeably less broken than console.log, possibly because of the lack of a newline character on the end.

What is the expected behavior?

It should be consistent with Promise.reject:

> Promise.reject('h')
Promise {
  <rejected> 'h',
  [Symbol(async_id_symbol)]: 96,
  [Symbol(trigger_async_id_symbol)]: 5,
  [Symbol(destroyed)]: { destroyed: false }
}
> Uncaught 'h'
>

Note that, although this does print Uncaught 'h' after the prompt, it then prints a new prompt immediately. With setTimeout and console.log, the new prompt isn't printed until backspace is pressed.

What do you see instead?

After step 3:
image
After step 4:
image
After step 5:
image

Additional information

Although I discovered this in v16.15.0, it also appears to happen in v14.19.2, v17.9.0, and v18.1.0.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Tái hiện vấn đề trong Node.js REPL bằng cách sử dụng setTimeout với console.log, sau đó theo dõi I/O console bất đồng bộ của REPL và việc xử lý prompt. Hoàn thành có nghĩa là đầu ra bất đồng bộ để lại một prompt nhất quán và giữ nguyên hành vi nhập liệu, tự động điền và phím backspace như trong ví dụ Promise.reject.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
javascript
Lĩnh vực
cli
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.