>> Rồi.
Vì vậy, các cliffhanger là, là những gì Node.js như bạn biết điều đó ngày hôm nay?
Bất cứ điều gì? Yeah?
>> Nó giống như một khuôn khổ văn bản JavaScript
ứng dụng rộng rãi -
>> OK, mà làm việc.
>> - Tôi biết như sử dụng phổ biến như -
hoặc một cái gì đó bạn có thể làm là như thế -
[Ghi chú không nghe được]
>> OK tốt.
Vâng, vì vậy nó là một khuôn khổ.
Nó là một công cụ mà bạn có thể thực thi mã JavaScript
trang web server.
Điều này có thể có nghĩa là đơn giản nhất của điều
như viết một dòng lệnh kịch bản không bằng Python hoặc Bash
hoặc Ruby hay PHP, nhưng chỉ của riêng mình JavaScript
và thực hiện nó ở một nhấp nháy dấu nhắc lệnh.
Hoặc bạn có thể chạy nó trong một máy chủ web.
Và trên thực tế trong Node.js chính nó,
khuôn khổ này là một bó toàn bộ các thư viện trong đó có
trong máy chủ HTTP tích hợp.
Vì vậy, bạn thực sự có thể viết một máy chủ như chúng ta sẽ thấy
chỉ trong một thời điểm, siêu dễ dàng bằng cách chỉ để hiểu một chút
HTTP và cổng TCP và.
Và bạn có thể đẻ trứng một nghe máy chủ web mà không cần Apache,
mà không cần IIS của Microsoft.
Nếu không có bất kỳ khác phần mềm cài đặt,
bạn chỉ có thể đẻ trứng này và lắng nghe hầu hết bất kỳ cổng
trên hệ thống mà bạn được phép.
Vì vậy, trường hợp và các điểm, hãy để tôi đi và mở
lên ví dụ này, máy chủ 0.js.
Vì vậy, nhận thấy rằng đầu tập tin này, chỉ cần một bó
ý kiến ​​thú vị, và sau đó có một cặp vợ chồng
các dòng đại diện của mã rằng chúng ta sẽ thấy recurringly.
Vì vậy, var HTTP được yêu cầu "HTTP".
Vì vậy, được xây dựng trong Node.js ' cơ sở hạ tầng là một bó toàn bộ
các mô-đun đó có thực sự chỉ thư viện và tất cả mọi thứ là loại
không gian tên với định danh duy nhất
như thế này là "HTTP".
Vì vậy, như trong rất nhiều các ngôn ngữ như Java và C + +
và C, chỉ khi bạn nhập khẩu hoặc bao gồm
hoặc nút nói chuyện yêu cầu một mô-đun không bit của nó.
Và tất cả các bộ nhớ đòi hỏi được nạp
vào RAM và do đó được sử dụng.
Vì vậy, bạn loại tải này thư viện hoặc mô-đun theo yêu cầu.
Điều này có nghĩa đi trước và yêu cầu
cho chương trình này thư viện HTTP,
và tham khảo thư viện của cách của một biến được gọi là HTTP.
Nhưng biểu tượng bên trái này có thể đã được gọi là bất cứ điều gì, foo,
thanh, baz, nó không quan trọng.
Vì vậy, không giống như C + + và Java và C nơi khi bạn yêu cầu
hoặc nhập khẩu một thư viện, nó chỉ là loại
của trở nên dễ tiếp cận trên toàn cầu,
module Node.js là chặt chẽ hơn tên miền không gian.
Để riêng - chức năng chỉ có thể truy cập tại thời điểm này
bằng cách tên biến này.
Bạn không thể chỉ bắt đầu phương pháp đánh máy mà tồn tại
trong nó đúng một cách mà có lẽ là tốt,
bởi vì sau đó không gian tên của bạn không nhận được gần như lộn xộn
như trong rất nhiều ngôn ngữ.
Được rồi, vì vậy bây giờ là phổ biến đề nghị, việc tạo ra một máy chủ HTTP
Jonathan [giả chính tả] đã có thể là theo nghĩa đen
đơn giản như gọi tạo ra phương pháp máy chủ bên trong
của các mô-đun HTTP.
Vì vậy, điều này đang trở lại tài liệu tham khảo
một số loại máy chủ web.
Nó đến Apache, không trọng lượng nhất thiết phải là nặng.
Điều này là một chút đơn giản.
Và bây giờ, tôi phải chỉ chỉ cần làm một vài điều.
Vì vậy, đầu tiên, hãy để tôi di chuyển xuống phía dưới đây
và bỏ qua xử lý phương pháp cho một thời điểm.
Và thông báo dòng mã này,
đó là server.on về cơ bản có nghĩa là máy chủ -
nghe như trong mã jQuery,
nghe cho một sự kiện được gọi là yêu cầu
và chỉ mất một đoán tôi nên làm gì
khi một sự kiện theo yêu cầu cháy trong các máy chủ.
Yeah?
>> Hãy gọi cho xử lý chức năng.
Vì vậy, nghĩa là thực hiện mã đó là tham chiếu
bởi biến này và thực sự không phải là một biến để biểu tượng ở đây,
biểu tượng đó là những gì đề cập đến?
Vâng, tên này chức năng ở đây
và xử lý rõ ràng mất hai đối số.
Tại sao hai? Vâng, nếu bạn chỉ đọc tài liệu không
cho mô-đun đặc biệt này, bạn sẽ được cho biết rằng xử lý
sẽ được gọi sẽ thông qua ít nhất hai đối số,
một tham chiếu đến các yêu cầu,
và bên trong yêu cầu chúng tôi nghĩa đen có nghĩa là yêu cầu HTTP.
Vì vậy, tất cả những tiêu đề HTTP mà bạn có thể nhớ lại
từ đầu học kỳ hoặc một số lớp trước
hoặc kinh nghiệm như được dòng và dòng máy chủ
và dòng User-Agent, tất cả điều đó được đóng gói và trong hơn
của đối tượng yêu cầu này.
Và đối tượng phản ứng là sắp xếp dữ liệu ra bên ngoài.
Vì vậy, bạn có một tham chiếu đến một đối tượng đó sẽ cho phép bạn
để gửi thông tin trở lại trình duyệt bằng cách gọi phương pháp
trên rằng lập luận sau gọi là Res cho phản ứng.
Nhưng điều này có thể được gọi là foo hoặc thanh, điều này chỉ là ước.
Vì vậy, bây giờ, tôi phải làm gì?
Vâng, có vẻ như bên trong của máy chủ web siêu đơn giản này
mà tôi đang thực hiện, tôi sẽ làm như sau.
Tôi sẽ viết một HTTP tiêu đề với mã trạng thái 200,
200 ý nghĩa OK, tất cả là tốt.
Và sau đó, tôi sẽ để vượt qua trên rõ ràng.
Các kiểu dữ liệu của những gì số thứ hai vào đầu phải không?
>> Đây là một đối tượng?
>> Đây là một đối tượng với bao nhiêu khóa và giá trị?
Chỉ là một trong mỗi, phải, một giá trị quan trọng của cặp.
Vì vậy, "loại nội dung.
Và lý do duy nhất Tôi trích dẫn ở đây là
bởi vì có thể là dấu gạch ngang đúc kết cho một dấu trừ
hoặc một cái gì đó như thế.
Vì vậy, tôi phải trích dẫn nó ở đây, singe hoặc dấu ngoặc kép.
Nhưng mô hình một lần nữa chung
trong mã JavaScript thường báo giá duy nhất những ngày này,
ruột kết và sau đó là giá trị.
Vì vậy, điều này chỉ là cái gọi là loại tâm.
Đây là một tiêu đề HTTP đó là nghĩa đen đi
là kiểu nội dung gạch nối đại tràng văn bản đồng bằng dấu gạch chéo đó sẽ
được gửi từ máy chủ cho trình duyệt
để trình duyệt biết liệu để chạy văn bản như liệu này
hoặc HTML hoặc như là một hình ảnh hoặc một bộ phim
hoặc một tập tin flash hoặc bất cứ điều gì khác.
Bây giờ, nơi nào tôi thực sự muốn để gửi trong cơ thể của trang web?
Vâng, chỉ bằng cách đọc tài liệu
cho các đối tượng phản ứng bên trong thư viện này.
Tôi thấy rằng có một quyền phương pháp và phải mất một chuỗi,
có lẽ những thứ khác nhưng tối thiểu một chuỗi.
Và chuỗi là những gì nhổ ra cho trình duyệt.
Trong trường hợp này siêu của nó đơn giản, thế giới hello của nó,
nhưng nó có thể là opne khung, html, khung gần,
đầu mở khung, gần khung và vv,
đây có thể là nguyên html.
Nhưng chúng tôi đang giữ ví dụ đơn giản chỉ bằng cách nhổ nước bọt
ra đơn giản nhất của loại tâm mà được cho là text / plain.
Và sau đó Response.End chỉ có nghĩa là đóng kết nối
và gửi tất cả mọi thứ tôi có loại đệm bên trong
của đối tượng này lại cho trình duyệt.
Tôi đang thực hiện. Được rồi.
Vì vậy, điều cuối cùng Tôi đang làm ở đây
và điều này là hơi tùy ý và có nghĩa là để được mát mẻ,
là tôi đang nói sự máy chủ cuối cùng để lắng nghe
trên một giao thức TCP nhất định bằng cổng mặc định.
Nhớ lại từ đầu của lớp dịch vụ -
hoặc bạn thường duy nhất xác định nó bằng con số,
AD là web, 443 là HTTP dựa các trang web, 22 là SSH, 21 là FTP
và năm 1337 chỉ là tùy ý nhưng nó cao hơn 1024
có nghĩa là trên nhất hệ thống, tôi có thể sử dụng nó
mà không cần siêu đặc quyền người dùng.
Vì vậy, nó chỉ là thuận tiện.
Nhưng 8080 là ở off - một chung một, 8088, thực sự bất cứ điều gì lớn
trong hàng ngàn thông thường nhưng điều này chỉ là hơn ưu tú.
Được rồi, vì vậy những gì xảy ra khi tôi thực sự chạy?
Vâng, tôi không chỉ cần truy cập trang trong trình duyệt.
Tập tin này được gọi là máy chủ 0.js.
Bởi vì một lần nữa, Apache là bây giờ ra của hình ảnh
cho nửa cuối của khóa học.
Nếu tôi muốn web máy chủ, tôi cần phải viết
và sau đó chạy máy chủ web này.
Nhưng nó quay ra rằng JavaScript cả về phía khách hàng
và phía máy chủ là một ngôn ngữ giải thích.
Vì vậy, tất cả tôi cần là một thông dịch viên.
Vì vậy, nó là - nếu nhấn mạnh để chạy nút và sau đó máy chủ 0.js,
Tôi có thể có hoặc có thể không nhìn thấy một số lượng tùy thuộc
về những gì tôi đã bao gồm thư viện, không có gì có thể xảy ra.
Nhưng hãy để tôi đi đến một trình duyệt và cho tôi đi
để cùng địa chỉ IP khách hàng CS50 của tôi.
Nhưng điều này chỉ có thể cũng là máy Mac của tôi
hoặc máy tính của tôi và sau đó nhấn Enter.
Mà thực sự trông giống như Apache.
Điều đó giống như thư mục danh sách chúng ta nhìn
ở trong hiệp một.
Vì vậy, tôi đã làm gì sai?
Yeah.
[Ghi chú không nghe được]
Chính xác, phải không?
Vì vậy, Apache vẫn còn nghe trên cổng mặc định 80.
Mặc dù tôi có thể thay đổi điều đó, Tôi có thể tắt nó đi tất cả cùng nhau
nhưng nó vẫn chạy.
Nhưng những kẻ có thể chắc chắn cùng tồn tại.
Tôi chỉ đơn giản là phải đặt ruột kết 1337 và sau đó có thể
hoặc có thể không phải là một dấu gạch chéo vào cuối để truy cập vào cổng này
mà máy chủ này đang chạy trên.
Và bây giờ tôi thấy rằng hello, thế giới đã trở lại.
Và tôi có thể nhấn tải lại như nhiều lần tôi muốn,
nó vẫn còn phục vụ lên một trang.
Thực sự nếu tôi mở Chrome thanh tra, vào mạng
và sau đó tải lại toàn bộ trang,
nhận thấy rằng thực sự đây là yêu cầu đã được gửi.
Nếu tôi nhìn vào nguồn nguyên liệu,
nhận thấy trình duyệt của tôi gửi tất cả những điều đó.
Và sau đó là phản ứng từ các máy chủ đã được siêu đơn giản.
Có 200.
Nếu nó không phải là quá thấp trên màn hình,
có các loại nội dung.
Và sau đó Node.js loại tự động
cho tôi thêm ngày và tất cả những thứ khác
mà các trình duyệt thường mong đợi.
Vì vậy, chúng ta hãy xem một ít kiểm tra sự tỉnh táo.
Hãy để tôi quay trở lại mã trong máy chủ 0.js và cho tôi -
mỗi khi tôi đi vào xử lý,
hãy để tôi chỉ nói console.log.
('Chúng tôi đã có một người truy cập!').
Tôi không cần phải biên dịch lại hoặc bất cứ điều gì như thế,
nó là một ngôn ngữ giải thích.
Vì vậy bây giờ, hãy để tôi quay trở lại trang, lại một, hai,
ba lần và đi sao cho cửa sổ của tôi.
Và bây giờ tôi thấy điều này.
Vâng đó là lạ, Tôi thấy sáu dòng.
Thú vị đố web, tại sao Tôi nhận được sáu yêu cầu không ba?
Yeah?
[Ghi chú không nghe được]
Yeah. Vì vậy, như bạn có thể biết biểu tượng nhỏ ngu ngốc trong đầu
của thanh trình duyệt mà rất nhiều
các trang web sử dụng sức mạnh là một đỉnh Harvard,
nó có thể là một biểu tượng công ty hoặc bất cứ điều gì như thế.
Vì vậy, các trình duyệt ngày nay loại
của presumptuously làm thêm yêu cầu HTTP
đến hầu hết mọi trang web mà bạn truy cập kiểm tra nếu có
theo mặc định một tập tin gọi là favicon.ico
trong cùng thư mục các tập tin mà bạn yêu cầu.
Và nếu như vậy, nó đặt biểu tượng đó.
Vì vậy, tất cả chúng ta đang thấy là chính xác điều đó.
Và trong thực tế, chúng ta hãy xem nếu chúng ta có thể thấy điều này chứ không phải là loại
ra chỉ là, "Chúng tôi đã có một người truy cập.
Hãy để tôi đi trước và đầu ra.
Và tôi chỉ biết điều này từ nhìn vào tài liệu.
Có một tài sản bên trong các đối tượng yêu cầu được gọi là URL
mà xảy ra được con đường
đã được yêu cầu trong URL thực tế.
Vì vậy, nếu tôi khởi động lại máy chủ đơn giản bằng cách chạy lại nút
trên máy chủ và 0.js bây giờ thế này, hai,
ba và quay trở lại đây.
Có nó được.
Slash là những gì tôi - con người yêu cầu
trong favicon.ico là những gì các trình duyệt
presumptuously yêu cầu.
Nhưng vấn đề không phải là quá nhiều thứ favicon
nhưng làm thế nào các máy chủ đang hoạt động.
Yeah?
>> Tại sao có có một số yêu cầu?
>> Tại sao có đến - bởi bản chất của cách thức HTTP hoạt động.
Vì vậy, chỉ có thể yêu cầu HTTP một tập tin tại một thời điểm.
Trình duyệt có thể được thông minh trong những ngày
và giữ cho giao thức TCP kết nối mở.
Nếu bạn đã CS143 hoặc thường quen thuộc với mạng,
vì vậy bạn có thể nhận được lợi ích hiệu quả
bằng cách giữ mạng ổ cắm mở
trong việc đưa ra nhiều HTTP yêu cầu nối tiếp trên nó
nhưng họ là một tập tin theo yêu cầu.
Vì vậy, nếu bạn truy cập một cái gì đó giống như -
Tôi có nghĩa là chúng ta có thể đi đến hầu hết bất kỳ trang web.
Nếu bạn đi đến - chúng ta hãy kéo lên thanh tra của Chrome tại đây.
Nó có thể được lấp đầy nhất của trang.
Vào tab mạng và đi đến www.cnn.com.
Và khi bạn truy cập cnn.com, trang chủ của nó -
trình duyệt của bạn chứ không phải tàn nhẫn làm - vẫn còn tiếp tục.
OK. Ít nhất 289 HTTP yêu cầu một lần nữa và một lần nữa.
Và đây là lý do tại sao khi bạn truy cập các trang web đặc biệt là cồng kềnh,
họ đang làm chậm để tải vì tất cả
của tài sản họ đang tải.
Vì vậy, có vẻ như 298.
Có thể có một số Ajax xảy ra vào thời điểm này hoặc một số
của tài sản chỉ là thấp.
Vì vậy, mỗi người là một yêu cầu cá nhân sẽ trở lại
và ra, qua lại.
Và đó là lý do tại sao trước đó, thậm chí mặc dù chúng tôi đã nói chuyện loại
về nó một chút fancifully nơi bạn đặt các thẻ script,
hoàn toàn làm cho một sự khác biệt khi bạn có -
nó bắt đầu có rất nhiều của giao thông và rất nhiều
các tập tin được yêu cầu.
Và mỗi này đại diện cho có thể là một hình ảnh, một tập tin phương tiện truyền thông,
một tập tin JavaScript, Tập tin CSS hoặc tương tự.
Vì vậy, chúng tôi đã lên đến khoảng 4 MB chỉ
để xem tin tức ngày hôm nay.
Tốt câu hỏi.
Được rồi.
Vì vậy, một số là gì những mặt tích cực mặc dù?
Phải, chúng tôi biết làm thế nào để làm cho các trang web đã được với PHP.
Và nhiều bạn vào sân để lớp biết Django
và Python hoặc đường ray với Ruby.
Vì vậy, tại sao chúng ta cần thêm một ngôn ngữ và cơ sở hạ tầng?
Là những gì Node.js đặc biệt tốt nếu bạn biết?
[Tạm dừng]
Một số điều?
Không? Yeah?
>> Chuyển tiếp tin nhắn.
>> Vì vậy, chuyển tiếp tin nhắn.
Vì vậy, đó là sự thật và đó là sự thật vì một lý do kỹ thuật
và Node.js và thực sự JavaScript là đặc biệt
rất phù hợp với không đồng bộ mã,
nếu nhờ đó mà bạn tạo ra ảo giác
làm nhiều việc cùng một lúc.
Vì vậy, mặc dù họ thực sự xảy ra nối tiếp,
thực sự trong nhiều trường hợp, JavaScript cả hai phía khách hàng
và phía máy chủ là đơn luồng.
Mà nếu bạn đang dùng 161 hoặc thậm chí 61 có nghĩa là -
của chương trình này biết,
thông dịch viên có thể theo nghĩa đen chỉ làm một việc cùng một lúc.
Nhưng điều này không phải là tuyệt vời cho một cái gì đó giống như một máy chủ web
nơi bạn có thể có hàng chục hoặc hàng trăm hoặc thậm chí hàng ngàn
của người sử dụng tất cả các cố gắng để truy cập vào trang web của bạn
tại thời điểm rất giống nhau.
Tuy nhiên, đề nghị đó mà xử lý chúng một
sau khi khác sau khi khác đặc biệt là nếu một số
những yêu cầu như chúng ta đã thấy trên CNN có thể yêu cầu phục vụ
lên 300 tập tin trước khi bạn thậm chí có được cho người sử dụng tiếp theo
ai muốn xem cho biết tin tức.
Node.js là phù hợp hơn cho các môi trường như thế.
Bởi vì những gì xảy ra là bất kỳ quá trình chạy chậm
như đọc một tập tin từ đĩa hoặc truy vấn cơ sở dữ liệu hoặc nói chuyện
một số máy chủ mạng khác,
có xu hướng có độ trễ, phải không?
Nếu bạn có 61 hoặc 161 đặc biệt là tất cả các loại này
các dịch vụ ngoại vi có xu hướng chậm hơn nhiều
hơn là làm bất cứ điều gì bên trong bộ nhớ RAM giống nhau và cùng một CPU
mà nói trong trường hợp này máy chủ đang thực sự chạy.
Nhưng những gì tốt đẹp về Node.js là bạn có thể -
và JavaScript nói chung là bạn có thể làm điều gì đó
và sau đó nói, "Hmm, điều này sẽ
để đưa tôi một vài mili giây hoặc thậm chí vài giây.
Hãy để tôi loại ngã ba mà ra, " nhưng nó không phải là một quá trình thật sự.
Và sau đó khi nó được thực hiện làm quá trình chạy mà chậm
như lấy hàng từ một cơ sở dữ liệu hoặc đọc một tập tin. html
từ đĩa, nó sẽ lấy lại cho tôi khá
hơn tôi phải chờ đợi cho nó.
Vì vậy, để thực hiện điều này rõ ràng hơn.
Đây là phương tiện của tôi làm này quen thuộc hơn.
Được rồi, vì vậy đây là Lắc Shack ở quảng trường.
Đây là loại một mô hình phổ biến
để giải thích asynchronicity.
Đây thực sự là một tốt ví dụ vì Shake Shack
và Burger ngon là đáng kể chậm cho những gì họ làm.
Nhưng vấn đề là họ thực sự tốt tại nhận đơn đặt hàng
và lấy tiền của bạn sau khi mà bạn chờ đợi cho thực phẩm của bạn.
Vì vậy, đây thực sự là một tốt hơn thiết kế hơn thay thế.
Vì giả sử bạn bước vào một cửa hàng như thế này và bạn có
vào phía trước của dòng và bạn đặt hàng và bạn muốn
để burger, là tốt nhất tôi có thể cho biết, phải mất ít nhất năm
phút hoặc hơn để thực sự có được một burger.
Vì vậy, nó sẽ là loại của một mô hình kinh doanh xấu
nếu trong khi bạn đang chờ đợi bạn burger, Alice [giả chính tả]
và Bob [giả chính tả] và Charlie [chính tả giả định]
và mọi người khác là xếp hàng phía sau bạn
và bạn có nghĩa là ngăn chặn dòng chờ đợi thức ăn của bạn.
Vì vậy, rõ ràng, tại Shake Shack
và thức ăn nhanh khác nơi không làm được điều này,
họ làm một cái gì đó như thế này.
Họ cung cấp cho bạn một bộ rung.
Và họ loại gửi bạn trên con đường của bạn.
Và họ gọi lại cho bạn bởi làm điều ít rung này
hoặc flash để có được sự chú ý của bạn.
Vì vậy, đây là nghĩa gì?
Một cái gì đó như Node.js không.
Nếu Node.js hoặc JavaScript nói chung đang được sử dụng
và các lập trình viên là đủ thông minh
để nhận ra, "Bạn biết những gì?
Bất cứ điều gì tôi cần phải làm ngay ở đây có thể mất một số
mili giây hoặc giây.
Bạn biết những gì?
Hãy để tôi đi trước và không gọi nó là đồng bộ -
"Đó là anh chàng chặn tất cả mọi người khác trong dòng, "-
hãy để tôi đi trước và loại bước sang một bên
và chỉ cần gọi bản thân mình trở lại
khi mà chạy dài hoạt động hoàn tất. "
Và gọi lại tất nhiên được ám chỉ trong trường hợp này
đến một chức năng gọi lại, một tham chiếu đến một mâm cặp mã
mà sẽ được thực hiện khi bánh burger của bạn đã sẵn sàng,
giống như điều này có một số loại chức năng được xây dựng trong
mà nó bắt đầu rung hoặc ù khi đó là thời gian cho bạn
được gọi trở lại phía trước của dòng.
Vì vậy, những gì thực hiện điều này có nghĩa là trong điều kiện thực tế?
Vâng, chúng ta phải làm việc theo cách của chúng tôi lên.
Vì vậy, hãy để tôi đi trước và làm điều này đầu tiên.
Trong máy chủ 1.js, hãy để tôi đầu tiên đơn giản hóa mã
vì vậy chúng tôi có thể thực hiện các bước đối với bé một vấn đề hấp dẫn hơn.
Đây là chính xác giống chương trình mà tôi đã viết trước đây.
Nhưng những gì đã được thay đổi?
Có loại một chút sự khác biệt cú pháp
giữa điều này và phiên bản 0 một thời điểm trước đây.
Những gì nhảy ra lúc bạn nếu bạn nhớ lại?
Vâng Cynthia [giả chính tả]?
[Ghi chú không nghe được]
Yeah. Vì vậy, bây giờ, chúng tôi có một dòng chức năng được thông qua nhập
Chúng tôi đã gạt bỏ các loại
của vô ích có tên chức năng xử lý.
Vô dụng chỉ trong mà trước thậm chí gọi đó là ở một nơi,
Tôi không thực sự cần phải lãng phí thời gian cho nó một tên
và làm cho nó khó khăn hơn để đọc mã trên xuống dưới.
Vì vậy, chúng ta hãy chỉ cần khai báo nội tuyến là một chức năng vô danh.
Và tôi đang làm hai thứ khác.
Tôi đang làm tốt hơn sử dụng các ký hiệu dấu chấm.
Vì vậy, như trong jQuery, rất nhiều nút phương pháp có thể được xích lại với nhau.
Vì vậy, một khi bạn đang thực hiện cuộc gọi một cái gì đó, bạn không có
phải chờ đợi để một dòng mới và gọi phương pháp khác,
bạn có thể chỉ chuỗi chúng lại với nhau.
Và như vậy theo cách này, chúng ta có thể thực sự thắt chặt này lên.
Vì vậy, điều này có nghĩa là một máy chủ web trong năm dòng
tổng số đang không giống như -
không giống như những gì bạn có thể bình thường phải làm gì để thiết lập một cái gì đó.
Nếu tôi đi vào máy chủ 2 bây giờ, chúng ta hãy làm điều này.
Trong máy chủ 2 - thực sự cho phép của trở lại máy chủ 2.
Hãy bây giờ mở ra async-0.js và giải quyết vấn đề ở bàn tay.
Vì vậy, đầu tiên, chúng ta hãy đi trước và mở
lên async-0.js trong trình duyệt.
Vì vậy, async-0, hãy để tôi đi sao cho trình duyệt.
Nhấn tải lại.
Và bây giờ, đây là loại thông báo lỗi.
Thực sự tôi đang nhìn thấy một 500 trong thanh tra của Chrome.
Nhưng hãy để tôi chính xác hơn yêu cầu hello.txt.
OK. Vì vậy, điều này dường như làm việc.
Vì vậy, async-0.js dường như không phục vụ lên một cái gì đó cho dấu gạch chéo.
Nó không có hỗ trợ tập tin mặc định.
Nhưng nếu tôi một cách rõ ràng yêu cầu hello.txt,
mà dường như được hỗ trợ.
Tại sao vậy?
Vâng, những gì tôi đã đi đây
và thực hiện được thực hiện một máy chủ web siêu đơn giản
mà thể hiện nơi asynchronicity có thể hữu ích.
Và đó là thực hiện như sau.
Trước tiên, tôi đang sử dụng Mô-đun HTTP một lần nữa,
nhưng cũng FS mà có thể là viết tắt của?
Nói chung trong CS, hệ thống tập tin.
Hệ thống tập tin OK.
Do đó ra FS, hệ thống tập tin.
Được rồi, vì vậy những gì điều này cho tôi?
Chức năng liên quan đến các tập tin như nhận được thông qua,
mở các tập tin, viết thư mục, đọc thư mục
và tất cả các loại công cụ.
Vì vậy, bây giờ chú ý, mã này là giống như trước,
tạo ra các máy chủ, đi qua trong một chức năng vô danh.
Đây là loại tùy ý.
Đây không phải là rất máy chủ web an toàn.
Trong thực tế, bạn có thể truy cập hầu hết bất kỳ tập tin trên ổ cứng của tôi
hoặc trên máy chủ cứng lái xe bằng cách thực hiện mã này
bởi vì tôi chỉ là một cách mù quáng giả định rằng tôi sẽ
để lấy bất cứ điều gì người dùng yêu cầu trong URL.
Và tôi sẽ tiền tố nó với dấu chấm
để tôi nhẹ được an toàn
bằng cách nói bất cứ điều gì họ có thể tập tin yêu cầu có ít nhất bắt đầu
trong thư mục hiện hành.
Tất nhiên có một mối đe dọa ở đây.
Bởi vì nếu họ thay vì bao gồm những gì?
Trong con đường của mình, họ có thể loại của việc xung quanh đó quá.
Dấu chấm, dấu chấm, phải không?
Vì vậy, nếu người sử dụng chỉ cần đặt dấu chấm, dấu chấm trong URL, trong lý thuyết,
họ có thể bắt đầu nhận được của tôi - và nói tập tin mật khẩu.
Vì vậy, điều này không có nghĩa là được bảo đảm,
nó có nghĩa là phải đơn giản.
Vì vậy, ở đây, tôi có một biến mà là nối của dấu chấm
đó là thư mục hiện tại và URL yêu cầu
mà chúng ta đã thấy trước là như giảm hoặc / hello.txt.
Vì vậy, bây giờ, nó được một ít thú vị hơn.
Đầu tiên, thông báo phía dưới.
Tôi đang lắng nghe trên cùng cổng như trước.
Vì vậy, thực sự thú vị làm việc là bên trong đây.
Mỗi khi một yêu cầu đến trong bản chất
của mã này, những gì tôi làm?
Tôi gọi tập tin phương pháp đọc tập tin hệ thống,
đi qua trong con đường mà tôi muốn đọc.
Và bây giờ, đây là điều thú vị ở đây,
điều này là do thực hiện trong phương pháp không đồng bộ.
Bạn không thể thu lại được giá trị từ đọc tập tin.
Trong thông báo thực tế, có biểu hiện không trái tay
bên trái của tập tin đọc.
Nó không trả lại một giá trị.
Thay vào đó, nó gọi một cuộc gọi lại hoạt động khi nó đã sẵn sàng
cung cấp cho bạn lại một câu trả lời.
Vì vậy, một lần nữa để được rõ ràng, trong khi trong năm qua,
trong nhiều chương trình ngôn ngữ, nếu bạn muốn
để đọc một hồ sơ vụ án tại điểm PHP,
tập tin được gạch dưới nhấn mạnh nội dung,
bạn có một biểu hiện bên tay trái trong tất cả các giá trị sau -
trước khi các dấu bằng, có nghĩa là bạn đang gán
để biến sự trở lại giá trị của chức năng đó.
Bạn có thể làm điều đó trong Node.js, nhưng bạn thường có
gọi một cách rõ ràng đồng bộ các phiên bản của các chức năng thích,
Tôi nghĩ rằng nó đọc đồng bộ tập tin hoặc đồng bộ đọc tập tin.
Tôi quên cách họ đặt tên cho nó.
Và rằng sẽ cung cấp cho bạn một giá trị trả về.
Nhưng nếu tập tin đó là trên một số hệ thống tập tin từ xa
hoặc ổ đĩa chỉ là tự nhiên chậm, nó có thể mất 10 phần nghìn giây
hoặc 2 giây cho tập tin đó để thực sự trở lại.
Trong khi đó, không có web khác du khách được phục vụ
bởi websit của bạn.
Bạn đang ngăn chặn.
Đó là những gì được gọi là ngăn chặn IO, đầu vào / đầu ra.
Vì vậy, ở đây, đây là thông minh hơn nhiều.
Bởi vì những gì đang xảy ra Node.js
làm theo giải thích được như sau,
nó sẽ gọi phương pháp tập đọc,
cố gắng lên các tập tin của những người có một đường dẫn chỉ định bởi giá trị P.
Và sau đó nếu và khi nó sẵn sàng cung cấp cho bạn lại nội dung
của tập tin P, nó sẽ gọi một chức năng có chữ ký
theo quy ước như sau.
Hai đối số, lần đầu tiên đó là có thể là một đối tượng lỗi,
vốn E, nó là một đối tượng gọi là lỗi hoặc Null
nếu không có lỗi như vậy.
Và đối số thứ hai - mất đoán - là có được những gì?
Nó được gọi là dữ liệu rõ ràng nhưng là những dữ liệu cụ thể hơn?
>> Nội dung?
>> Nội dung hello.txt trong ví dụ này tôi kéo
trong trình duyệt của tôi lúc nãy.
Vì vậy, nói cách khác để đọc tập tin và nhiều chức năng Node.js
như tại không trở về giá trị.
Họ gọi callback và vượt qua
cho những gì sẽ callbacks đã theo truyền thống
giá trị trở lại.
Ưu điểm của phương pháp này là
mà bạn có thể gọi đọc tập tin một T0.
Chức năng gọi lại sức mạnh không thể được gọi là một đánh dấu sau
do đó, để nói chuyện tại T, nó có thể được gọi là một T1000,
một ngàn ve sau.
Nhưng vấn đề là các phần còn lại của các mã trong tập tin này,
nếu có sẽ ngay lập tức được thực hiện trong khi Node.js
và trong khi hệ thống tập tin con số ra làm thế nào để đọc
tập tin và nhận được nó sao cho bạn.
Vì vậy, bạn tạo ra điều này -
một cách hiệu quả những ảo ảnh
song song trong khi cho phép tiến trình đang chạy chậm hơn không phải là
ngăn chặn các công cụ quan trọng, phần mà phục vụ người sử dụng.
Vì vậy, làm thế nào để chúng tôi xử lý này?
Điều này là rất phổ biến mô hình Node.js.
Và có cách chỉ để đơn giản hóa đây là chúng ta sẽ thấy trước khi cùng.
Đầu tiên tôi đã kiểm tra nếu Lỗi không phải là null.
Vì vậy, nếu nó không phải là sai sau đó có một lỗi.
Tôi không biết đó là gì, có thể các tập tin không tồn tại.
Tôi không có quyền truy cập.
Tên đường dẫn là sai.
Bất kỳ số lượng của sự vật có thể đi sai.
Bây giờ, tôi sẽ tự ý trả lại 500
đó là lỗi máy chủ nội bộ.
Một cái gì đó đã đi sai.
Tôi không thực sự quan tâm để chẩn đoán nó.
Vì vậy, chúng ta hãy chỉ nói người sử dụng nó bị hỏng.
Và sau đó, tôi sẽ làm res.end,
và đây là ký hiệu viết tắt.
Nhớ lại rằng cuối cùng Hiện tôi đã làm res.write
và sau đó tôi đã làm res.end.
Nếu bạn chỉ muốn gửi một dòng đầu ra,
bạn chỉ có thể làm tất cả cùng một lúc với res.end với một tham số,
và đó sẽ gửi bất cứ điều gì thông báo lỗi là
bên trong của đối tượng này cho trình duyệt.
Nó đã được khá phóng điện hồ quang nhớ lại một thời điểm trước đây.
Tôi không có ý tưởng gì này có nghĩa là ở cái nhìn đầu tiên.
Nhưng khi tôi yêu cầu một tập tin không tồn tại -
oops, chúng ta cần phải chạy máy chủ một lần nữa.
Khi tôi yêu cầu một tập tin không tồn tại, EISDIR,
một cái gì đó về nó là thư mục,
nếu tôi làm một số ngẫu nhiên chuỗi có,
dường như có nghĩa là tập tin thậm chí không tồn tại.
Và đó là bởi vì mã của tôi chỉ đơn giản là nói để viết
ra bất cứ nguyên Thông báo lỗi là,
vì vậy không rất dễ sử dụng thân thiện nhưng ít nhất tôi đang xử lý nó.
Khác, nếu nó không phải là một lỗi những gì tôi làm?
Cùng một điều là trước khi nhổ ra một 200 OK, một đồng bằng -
text / plain loại tâm và sau đó nhổ ra các dữ liệu.
Và đó là lý do tại sao tôi nhận được nội dung của hello.txt mà chỉ
để xác nhận nếu tôi nhìn tại hello.txt,
đó là nghĩa đen chỉ hello, thế giới.
Và nếu tôi thay đổi này hello, thế giới, lưu các tập tin,
chạy lại máy chủ, tải lại trang.
Bây giờ, tôi nhận được phiên bản đó.
Vì vậy, tôi đã thực sự chỉ reimplemented một máy chủ web
như đã tồn tại nhiều năm nhưng sử dụng node.js.
Nhưng chúng ta có thể làm điều này thậm chí nhiều hơn sạch.
Hãy để tôi mở ra async-1.js.
Bây giờ, tôi nhận thấy thêm mô-đun khác thời gian này,
dường như các mô-đun đường.
Bây giờ, đây là một tốt cơ hội để tìm
vào những gì các tài liệu như thế nào.
Node.js là tài liệu hướng dẫn.
Như PHP tôi nghĩ là thực sự khá tốt
và thẳng về phía trước.
Nếu tôi đi đến Node.js và Google và tìm kiếm con đường Node.js,
những gì bạn sẽ thấy thường là một liên kết trực tiếp đến một URL
mà tôi đưa lên đây một thời điểm trước đây.
Vì vậy, / api là nơi chính thức để đi cho tài liệu.
Và những gì bạn sẽ thấy ở phía trên
các tài liệu chính thức của nút là tất cả các phương pháp và
hoặc tài sản bên trong mô-đun đặc biệt này,
một trong số đó được gọi là tham gia.
Và tham gia là các chức năng trợ giúp đó sẽ cho phép tôi
không bận tâm với tất cả các ưu điểm.
Và nó đã được thêm vào tiền thưởng như bạn sẽ thấy
từ bến cảng là nó cũng bình thường hóa đường dẫn kết quả.
Vì vậy, nếu người sử dụng hoặc bạn có dấu chấm hoặc dấu chấm dấu chấm hoặc bất kỳ sự kết hợp
những loại tương đối đường dẫn, một trong những mặt tích cực
của phương pháp tham gia là nó sẽ làm sạch tất cả những gì lên
và cung cấp cho bạn một kinh điển con đường mà không có bất kỳ
những dấu chấm hoặc dấu chấm chấm.
Vì vậy, đó là một điều tốt trong chung cho an ninh ít nhất
nếu bạn đang kiểm tra trả lại giá trị mà tôi không
trong trường hợp đơn giản đặc biệt này.
Nhưng tôi đã muốn sử dụng nó.
Vì vậy, bây giờ tôi tạo ra một con đường ít lập trình hơn
với path.join thay của nối liệu.
Vì vậy, đó là một chút sạch hơn so với trước đây.
Và bây giờ thấy tôi là một ít thông minh hơn chứ không phải
hơn là chỉ một cách mù quáng cố gắng đọc các tập tin,
Tôi sẽ thực sự gọi fs.stat.
Vì vậy, nếu bạn đã quen thuộc
với mức độ thấp C chức năng và C, thậm chí PHP.
Rất nhiều thư viện có chức năng này trả về chỉ số
về cơ bản thống kê vào một tập tin, kích thước tập tin,
các điều khoản, tên và những thứ như thế,
và cũng mặc nhiên nếu tập tin tồn tại hay không,
và nếu đó là một tập tin hoặc thư mục
hoặc liên kết tượng trưng hay cái gì khác.
Vì vậy, bây giờ nhận thấy, tôi gọi fs.stat.
Và sau đó dường như theo các tài liệu,
Tôi sẽ nhận được trở lại trong đối tượng Lỗi
hoặc Null sau bởi một đối tượng số liệu thống kê.
Nhưng chúng ta hãy kiểm tra này, node.js.fs.
Đây là tập tin tài liệu hệ thống.
Hãy để tôi tìm số liệu thống kê.
Có rất nhiều hơn các chức năng ở đây.
Rất tiếc, đó chỉ số đồng bộ, fs.stat.
Vì vậy, ở đây, nó không đồng bộ số liệu thống kê (2).
Đó là có nghĩa là nếu bạn nhớ từ các trang chính,
chương 2 của trang chính,
điều đó có nghĩa đây là nghĩa đen chỉ là một nút thực hiện
của cấp thấp chức năng hệ thống chỉ số.
Vì vậy, gọi lại được hai lập luận, lỗi và chỉ số
nơi chỉ số là một fs.stats đối tượng.
Vì vậy, chúng ta hãy xem những gì đối tượng này được cho là như thế nào.
Hãy nhấp vào liên kết và tôi thấy điều đó.
Các đối tượng có chứa số liệu thống kê dường như một số phương pháp giúp đỡ,
được tập tin, thư mục là, là một loạt các thứ khác.
Đó là "được" tập tin mà tôi quan tâm về trong trường hợp này.
Vì vậy, ở đây tôi đi.
Nếu có một lỗi, sau đó hãy để tôi chỉ bảo lãnh cho thời gian này
và giả định.
Nếu có một lỗi, đó là có thể là một tập tin 404 không tìm thấy.
Nó có thể là cái gì khác
nhưng tôi là một chút lười biếng ở đây chỉ tập trung
trên các chi tiết thú vị hơn.
Nhưng đối với người sử dụng của mục đích, tập tin không được tìm thấy,
nếu có bất kỳ lỗi nêu rõ các tập tin.
Nếu không, hãy để tôi kiểm tra xem tập tin thực sự là một tập tin thực tế.
Vì vậy, nếu nó không phải là một tập tin, nó tồn tại.
Có điều gì đó có nhưng nó có thể là một thư mục
hoặc có thể là một liên kết tượng trưng
hay cái gì khác đó là sôi nổi trên các hệ thống tập tin.
Dù bằng cách nào, người sử dụng không nên nhìn thấy nó.
Vì vậy, bây giờ, tôi chỉ cần đi nhổ
ra thông thường trái phép 403.
Nhưng một lần nữa chỉ là quy ước,
Tôi có thể sử dụng cái gì khác trong lý thuyết.
Và sau đó cuối cùng, hãy để tôi cố gắng đọc các tập tin.
Vì vậy, hãy để tôi di chuyển xuống.
Và bây giờ nhận thấy đây là nơi mà các mã có thể có được một chút lộn xộn,
thông báo rằng tôi sẽ gọi fs.readFile qua
trong cùng một con đường, cùng gọi lại như thời gian qua,
do đó, các phiên bản trước.
Và sau đó nếu tôi muốn tìm -
nếu tôi không tìm thấy nó, Tôi nhổ ra 500.
Và nếu tôi tìm thấy nó, những gì đường chúng ta sẽ thấy ở đây?
Chúng ta sẽ thấy fs viết tiêu đề 200 có thể
và một res.end gửi dữ liệu thực tế.
Nhưng thông báo này.
Và điều này là không chỉ thị của trường hợp xấu nhất.
Nhưng tôi có cuộc gọi chỉ số này đây hơn tôi có một số công cụ.
Sau đó, tôi có một gọi không đồng bộ ở đây,
vì vậy nhiều thụt đầu dòng.
Vì vậy, chỉ cần loại ngoại suy nếu bạn có thể từ đây.
Vấn đề gì có xu hướng phát sinh với ngôn ngữ như JavaScript
trong môi trường này, nơi bạn không có giá trị trả lại
mà bạn có các callbacks.
Và tất nhiên, điều này chỉ là một điều phong cách thực tế
mà tôi tiếp tục thụt.
Nhưng thực hiện việc này với bước tiếp theo hợp lý.
Giả sử có một hoặc hai hoặc ba chức năng khác
rằng tôi cần phải thực hiện đó là do bản chất không đồng bộ,
và do đó bạn chỉ cần loại giữ thụt để xử lý,
để xử lý, xử lý.
Bạn sẽ có được loại gọi lại địa ngục như mọi người gọi nó
nơi mà mã của bạn bắt đầu để có được rất rộng
và thẳng thắn thực sự khó khăn để đọc.
Như nó có, tôi có thể sắp xếp các chỉ nói rằng đây là sắp xếp của một dòng chảy
có loại này
của phong cách góc cạnh điều xảy ra ở đây.
Vì vậy, đây không phải là lý tưởng vì điều này có thể rất nhanh chóng trở thành
khó sử dụng, mặc dù hai không đồng bộ hóa không
một việc lớn như vậy.
Vì vậy, chúng ta có thể tránh điều này, phải không?
Bạn có thể đã thoáng thấy rằng Tôi misclicked một thời điểm trước đây.
Trong tài liệu, bạn biết đấy, có vẻ như có statSync.
Và statSync không mất một cuộc gọi lại như một tham số.
Chỉ mất con đường bởi vì nó dường như làm những gì?
Nó sẽ trả về một thể hiện của fs.stats.
Vì vậy, đây có thể là của bạn Bản năng đầu tiên, phải không?
Đặc biệt là nếu chức năng gọi lại
và asynchronicity là một ít mới cho bạn, thẳng thắn,
cách tiếp cận đơn giản nhất có lẽ là chỉ cần tránh các vấn đề tất cả
cùng nhau, quay trở lại để sắp xếp của phong cách lập trình CS101
nơi mà bạn gọi chức năng hoặc phương pháp, trả về giá trị,
gọi chức năng, lợi nhuận giá trị,
chức năng, trả về giá trị.
Và tôi có thể sử dụng do đó fs.statSync
đó theo nghĩa đen cùng nhưng đó là một phiên bản đồng bộ
có nghĩa là nó trả về giá trị.
Nó không vượt qua một giá trị để gọi lại.
Nhưng tại sao mà có lẽ là một Cách giải quyết tối ưu để nghỉ mát
chức năng đồng bộ?
Yeah?
[Ghi chú không nghe được]
Chính xác, phải mất một thời gian dài.
Bạn chỉ cần làm chậm tất cả mọi thứ xuống.
Bởi vì giống như Shake Shack hoặc Burger ngon, nếu chúng đã thoát khỏi
những chuông và làm bạn, khách hàng đứng ở phía trước
của dòng cho đến khi thực phẩm của bạn đã sẵn sàng thậm chí trước khi nhận yêu cầu,
của người phía sau bạn rõ ràng là
thông qua đặt chậm lại.
Mọi người bắt đầu để lại, bạn loại rút ra các gói tin.
Bạn có thể thực hiện bất kỳ số của sự tương tự ở đây.
Nhưng trong ngắn hạn, đó là có lẽ không phải là một điều tốt
cho doanh nghiệp hoặc cho máy chủ.
Mã để không đồng bộ là thường tốt nhất
trong trường hợp này, nhưng nó chắc chắn bắt đầu gây ra một số lo lắng.
Và trong thực tế, tôi dám nói khi đầu tiên viết công cụ này,
nó sẽ mất một chút chút về việc sử dụng để.
Vì vậy, hãy bắt đầu trang bị cho bạn với một số thư viện
và kỹ thuật để thực hiện này một chút dễ dàng hơn.
Vì vậy, một trong những phổ biến nhất thư viện là thư viện phổ biến
những ngày này, điều này một gọi là async.js.
Và cũng giống như rất nhiều Node.js thư viện hoặc mô-đun,
đây là tất cả mã nguồn mở.
Họ gần như tất cả sống và nhận được trung tâm kho là loại
của trở thành thực tế đặt để lưu trữ những điều này.
Và sau đó có một toàn bộ cơ sở hạ tầng
để cài đặt những điều này gọi là NPM, Nút Package Manager
mà nếu bạn đã quen thuộc với EvanTube là loại
của ứng dụng hoặc ứng dụng như nhận được.
Nếu bạn đã quen thuộc với Red Hat và Fedora
như trong thiết bị, nó giống như yum.
Nhưng đó là một nút - đó là một người quản lý gói chỉ
cho môi trường đặc biệt này.
Vì vậy, chúng ta có thể tải về và cài đặt những thứ như thư viện async
và cũng là một khác được gọi là nhấn mạnh thư viện hoặc mô-đun.
Nhưng những fs như xa, HTTP, con đường,
đó là tất cả đi xây dựng trong nút.
Vì vậy, nếu chúng tôi đi đến các tài liệu API, bạn sẽ thực sự thấy rằng xây dựng
vào nút bạn nhận được miễn phí một bó toàn bộ các mô-đun.
Nhưng rất nhiều người đẹp trên Internet đã làm cho hàng chục
nếu không phải hàng trăm các thư viện khác
để làm mọi việc tốt hơn hoặc khác nhau.
Vì vậy, chúng ta hãy nhìn vào cách thư viện này hoạt động.
Vì vậy, hầu hết các mã này là giống hệt nhau cho thời điểm này.
Tôi có một con đường là tạo lên hàng đầu.
Và bây giờ tôi gọi async.series.
Vì vậy, các thư viện async, nó chỉ là một thư viện cho phép bạn
để vượt qua hoặc tăng thường của chức năng để có được gọi là một
sau khi khác chỉ để loại tránh vấn đề thụt đầu dòng,
và thực sự chỉ là tinh thần cảm giác lo lắng rằng sẽ luôn phát sinh
ít nhất là khi bạn lần đầu tiên đi sâu vào điều này một mình
với lập trình không đồng bộ.
Như trong sang một bên, nếu bạn đã thực hiện 161 và bạn đã xử lý ổ khóa
và nâng cao điều kiện và tất cả đó, mã không đồng bộ
và một môi trường như Node.js thực sự là nhiều,
cho là đơn giản hơn nhiều
hơn thực sự bằng văn bản đang đa luồng.
Bất cứ lúc nào bạn có đang đa luồng,
bạn có điều kiện tăng lương.
Bạn phải lo lắng về hai chủ đề có chứa
cho các nguồn lực cùng đĩa hoặc bộ nhớ.
Vẻ đẹp của JavaScript
trong Node.js là có nghĩa là chỉ có một thread,
có nghĩa là trình duyệt
hoặc các máy chủ chỉ có thể làm một việc cùng một lúc.
Nó chỉ vào bạn, các lập trình viên
để giữ một mô hình về tinh thần cho làm thế nào bạn loại xếp hàng thứ
và tìm ra cách để đặt hàng mã của bạn.
Nhưng bạn không bao giờ phải lo lắng về nâng cao điều kiện
trong cách khá giống nhau ở ít nhất là với mã liệu như thế này.
Vì vậy, nó là một chút khó grack đây.
Nhưng - Vì vậy, hãy để tôi mở ra các tài liệu cho một lúc.
Thư viện async.js mà tương tự là rất googleable,
nó sống trong GitHub thay chậu như rất nhiều trong số họ.
Không nghĩ rằng đó là sơ sài, nó không phải.
Hãy để tôi di chuyển xuống để Read Me đây.
Vì vậy, các thư viện async cung cấp một bó toàn bộ
các phương pháp bên trong của nó.
Ví dụ, có một phương pháp được gọi là mỗi,
mà nếu tôi bấm này chỉ để xem tài liệu của mình cho một thời điểm,
đây là một chức năng hoặc phương pháp cho phép bạn làm điều gì đó
như mỗi một bốn nhưng song song.
Tất cả chúng sẽ xảy ra có khả năng song song.
Và phương pháp duy nhất là mỗi sẽ trả lại cho bạn khi tất cả
các lần lặp lại đầy đủ.
Như vậy có lẽ chúng xảy ra một sau khi khác.
Lý tưởng nhất, chúng xảy ra về cơ bản song song.
Nhưng phương pháp này không gọi lại cho bạn.
Nó không buzz của bạn còi cho đến khi tất cả
trong những yếu tố bạn có lặp qua đã hoàn thành.
Vì vậy, nó chỉ là một cách tốt đẹp
tránh sử dụng bốn vòng lặp đơn giản
nhưng thực sự làm một cái gì đó không đồng bộ.
Nhưng bây giờ trực tiếp hơn liên quan đến ví dụ này,
nhận thấy có điều này phương pháp loạt.
Và hãy để tôi kéo lên một ví dụ kinh điển đơn giản.
Vì vậy, các thư viện async, hàng loạt phương pháp có trong như ngụ ý
bởi các dấu ngoặc vuông trong mảng.
Dữ liệu là gì loại các yếu tố
trong mảng này dựa trên một ví dụ đơn giản?
Đây là một loạt các chức năng.
Vì vậy, trong C, bạn sẽ gọi họ hoạt động con trỏ.
Trong JavaScript, có nhiều đúng tài liệu tham khảo chức năng
hoặc chức năng ẩn danh.
Và điều này chỉ có nghĩa là, các mảng
tất nhiên được đặt hàng từ con số không trở lên.
Vì vậy, họ đã duy trì một đơn đặt hàng đó là tốt
cho một loạt, vì hàng loạt tất nhiên các phương tiện làm một cái gì đó
để không song song.
Vì vậy, điều này chỉ có nghĩa là điều này chức năng sẽ được thực hiện,
sau đó một này, thì đây một, chương trình này, sau đó thế này,
Tuy nhiên có nhiều
cho đến khi cuối cùng là tùy chọn gọi lại được gọi.
Vì vậy, nhận thấy mô hình ở đây.
Và mặc dù điều này là thư viện một anh chàng,
đó là đại diện của mô hình rất phổ biến JavaScript
của một lần nữa sử dụng callback.
Vì vậy, hãy chú ý những gì bạn làm ở đây.
Trong các chức năng đầu tiên là thông qua trong qua mảng này,
bạn định nghĩa một ẩn danh chức năng chỉ có chức năng.
Nhưng thông báo rằng rõ ràng theo tài liệu này,
mà chức năng ẩn danh nên có một gọi lại lập luận.
Đó là có được một con trỏ hoặc một tham chiếu đến một chức năng
mà bạn nên gọi khi bạn đang sẵn sàng trở lại một giá trị.
Vì vậy, một lần nữa, không giống như chỉ lập trình thường thủ tục
nơi bạn đang sử dụng để trả về giá trị ngay lập tức
rằng một sự khác biệt với sử dụng một thư viện như thế này
trong lập trình không đồng bộ hơn nói chung, là khi bạn đã sẵn sàng
để trả về một giá trị từ một cơ sở dữ liệu, từ một tập tin,
từ một số học biểu hiện, nó thuộc vào bạn
để gọi hàm gọi lại.
Và những điều tốt đẹp về thư viện này
nếu chúng ta đọc các tài liệu cẩn thận hơn nữa là,
khi và chỉ khi tất cả các khu vực được gọi là callback
mà không có một đối tượng lỗi, toàn bộ điều sẽ thành công?
Vì vậy, nói cách khác, nếu có 2,
nếu có 10 vô danh chức năng
trong mảng này do đó trong loạt bài này,
chỉ khi tất cả trong số họ thành công,
sẽ gọi lại tùy chọn thức được coi là thành công?
Nếu bất cứ ai trong số họ thất bại, tất cả các chức năng
sau khi nó sẽ không thậm chí được thực thi.
Vì vậy, đó là một cách tốt đẹp của loại có một chuỗi daisy
mà hủy bỏ sớm nếu có điều gì sai.
Vì vậy, để thấy điều này trong bối cảnh, đây là làm thế nào chúng ta có thể tái thực hiện
rằng chương trình trước đó.
Tôi lấy đường dẫn như trước, vì vậy đây là phần dễ dàng.
Sao chép dán mã bộ xương này
từ các tài liệu có async.series mở ngoặc,
mở khung vuông.
Và bây giờ thấy tôi có một chức năng trong đầu này
của một giây, chúng ta sẽ thấy nơi chúng tôi đi từ này.
Và bây giờ nhận thấy, đó là một ít phức tạp tại đầu tiên
nhưng chỉ tập trung vào nó dòng dòng.
Fs.stat có nghĩa là có được số liệu thống kê hoặc những gì không phải của con đường đó.
Gọi gọi lại này khi đã sẵn sàng.
Mã này cũng giống như trước đây.
Nếu có một lỗi, có một sự khác biệt bây giờ.
Một lần nữa, mô hình rất phổ biến trong lập trình Node.js là
nếu có điều gì sai và một cuộc gọi lại cần biết
mà theo quy ước, là người đầu tiên tham số để gọi lại sẽ
là không có, nếu tất cả là tốt hay tham chiếu đến một đối tượng lỗi,
vốn E. Nó giống như một Lỗi lớp học mà tồn tại trên toàn cầu
nhưng thêm vào đó một thời gian khác.
Vì vậy, bằng cách làm này, nếu có một lỗi, ý nghĩa là gì?
Cũng dựa trên những gì tôi cho biết bộ phim không có gì,
là nếu bất cứ điều gì đi sai, chúng tôi chỉ muốn loại
để hủy bỏ toàn bộ loạt chức năng của vô danh cuộc gọi.
Vì vậy, nó cũng đủ cho tôi để chỉ trả lại gọi lại đi qua
trong đối tượng Lỗi.
Bởi vì nếu chỉ số đã tôi trở lại một lỗi,
Tôi có thể tạo ra một mới Lỗi đối tượng của riêng tôi,
nhưng tôi không thực sự quan tâm đến,
Tôi chỉ muốn vượt qua bất cứ điều gì lỗi là thực sự xảy ra
để tôi có thể vượt qua nó để gọi lại này.
Và chỉ để được rõ ràng, trả lại là không thực sự cần thiết.
Tôi về cơ bản muốn làm điều này nhưng tôi muốn bây giờ "trở lại;
/ / Để không mã ở đây thực hiện ".
Vì vậy, một lần nữa một chung ước trong JavaScript,
mặc dù bạn không trả về giá trị cho mỗi gia nhập,
bạn muốn vượt qua giá trị với chức năng gọi lại
nhưng sau đó bạn muốn để ngừng thực hiện
các chức năng bạn trong, cách tầm thường
để làm điều này chỉ là gọi trở lại đây.
Nhưng không có gì sai,
chúng ta chỉ cần làm lại gọi lại lỗi mặc dù nó sẽ
để trở về giá trị không xác định.
Được rồi, điều này không trả lại một giá trị có khả năng nhất.
Tất cả tôi quan tâm là một lên máy bay thực hiện thêm.
Vì vậy, conflation của tôi về những hai dòng chỉ là một stylist
để ước chỉ để có số lượng dòng
mã tôi chỉ viết 2-1.
Vì vậy, những gì khác?
Nếu không có một lỗi -
thực sự được rõ ràng Tôi cũng có thể tránh được
rằng bằng cách làm nếu người nào khác.
Nhưng một lần nữa, một mô hình chung là kiểm tra
lỗi của bạn lên hàng đầu và sau đó chỉ trả lại thay vì tiếp tục
indent mã của bạn với elses và elses và elses.
Vì vậy, nếu nó không phải là một tập tin, bây giờ, bạn đã biết,
Tôi muốn để xử lý này một chút đặc biệt.
Vì vậy, đây giống như trong Java, C + + hoặc một vài ngôn ngữ khác,
đây là cách có thể khởi tạo một phản đối loại lỗi đi qua
trong tin nhắn mặc định không một tập tin
và điều này chỉ là phần nào tùy ý.
Nhưng tôi tín hiệu một lỗi của riêng tôi.
Và những gì thực hiện điều này cuối cùng dòng có lẽ là nghĩa gì?
Tất cả là tốt.
Nếu bạn vượt qua trong null cho tham số lỗi, mà chỉ có nghĩa là
theo quy ước tất cả là tốt.
Vì vậy, có nghĩa là những gì sẽ xảy ra một cách hợp lý?
Nếu null được thông qua để gọi lại
có nghĩa là vô danh này chức năng đã thành công
vậy để nói chuyện.
Vì vậy, những gì nên loạt các phương pháp đi trước và bây giờ dựa
trên định nghĩa bằng lời nói của tôi trước đó?
[Ghi chú không nghe được]
Di chuyển sang một trong những tiếp theo, phải không?
Nếu nó đã trở lại một không null giá trị, nó sẽ chỉ hủy bỏ
và không vô danh hơn chức năng sẽ được gọi.
Nhưng bởi vì nó có không, sau đó này sẽ được gọi tới.
Vì vậy, logic ở đây là khá nhiều giống như trước
và chúng tôi sẽ xem làm thế nào để làm sạch này lên cao hơn nữa trong một thời điểm.
Tôi nhận ra điều này là loại rất nhiều
để hấp thụ tất cả bằng lời nói và trực quan.
Nhưng bây giờ nhận thấy, thứ hai chức năng ẩn danh mà tôi muốn
để thực hiện trong series là để cố gắng đọc các tập tin.
Gọi gọi lại này khi bạn đã sẵn sàng.
Nếu có một lỗi, chỉ tín hiệu nó bằng cách gọi lại
để phần còn lại của công cụ này hủy bỏ.
Khác trở về null.
Nhưng tại sao tôi đi qua trong hai đối số?
Cũng thời gian này, nếu tôi đọc các tập tin và nhận được trở lại
như là một biến được gọi là dữ liệu,
Tôi muốn không chỉ biểu tất cả là tốt bằng cách quay vô giá trị
cho số đầu tiên.
Tôi muốn trở lại thực tế dữ liệu như là đối số thứ hai.
Bởi vì nếu tôi đọc thêm trong tài liệu,
chú ý đoạn này cuối cùng của mã khung vuông có nghĩa là đó là
cuối của bộ truyện.
Chỉ có hai vô danh chức năng trong loạt bài này.
Nếu có một lỗi ở đây, sau đó Tôi biết rằng một trong những kết
trong chuỗi này để để nói chuyện thất bại.
Vì vậy, nói cách khác, lỗi này là có được một đối tượng Lỗi
đó là vô giá trị nếu có của những kẻ thất bại.
Và nếu đó là trường hợp, tôi chỉ để giải cứu và tôi sẽ
nói 400 mà có nghĩa là yêu cầu không,
đó là rất chung chung thông báo lỗi.
Và sau đó, tôi sẽ in ra các thông báo lỗi.
Vì vậy, tôi không buồn được siêu hậu môn lúc này,
Tôi sẽ không để phân biệt giữa 500 và 404 và 403,
Tôi chỉ loại một cách mù quáng vẫy tay
và nói điều gì đó đã đi sai.
Nhưng nếu không có gì đã đi sai,
Tôi sẽ gửi này res.end qua dữ liệu này.
Bây giờ điều này có vẻ hơi khó hiểu.
Nhưng một lần nữa nếu tôi đọc các tài liệu,
đối số thứ hai để cuối cùng, gọi lại cuối cùng này,
anh chàng đó là chỉ thực hiện một khi bộ phim được thực hiện
thực hiện hoặc một phần có của, điều này là có được một mảng
của tất cả các đối số thứ hai
đã được thông qua để gọi lại.
Bây giờ, nó chỉ ra rằng chỉ liên kết trong loạt bài này
mà thực sự quay trở lại lần thứ hai tranh luận là một trong những điều này ở đây.
Vì vậy, tôi sẽ sắp xếp của một bước nhảy vọt của đức tin chỉ đơn giản là sử dụng giả sử
cho thời điểm đó cuối cùng là một phương pháp
cung cấp cho bạn cuối cùng các yếu tố của một mảng.
Vì mảng này đó là được thông qua
để tôi có hai indicies, không và một.
Nó chỉ là không không có giá trị bởi vì anh chàng này trả -
không vượt qua trong một giây tranh luận nhưng anh chàng này không.
Vì vậy, kết quả khung không là gì cả,
kết quả khung một chứa những gì,
nếu bạn đã làm theo cùng đến thời điểm này?
Các tập tin, xin chào, nội dung thế giới có lẽ,
vì vậy đó là làm thế nào tôi thực sự in nó.
Và hãy để tôi kết thúc một chi tiết ở đây.
Nếu tôi làm điều này loại cũ trường học, nếu tôi muốn có được
tại các yếu tố cuối cùng, nếu tôi có thể làm kết quả [results.length-1],
đó là sắp xếp của cách trường học cũ
truy cập các yếu tố cuối cùng trong - hoặc không có mảng chỉ số.
Nhưng như ở một bên, nhớ lại mà tôi đã có thư viện này
lên đây gạch mà theo ước chỉ được gọi là
nghĩa là một gạch dưới nhân vật mà không phải là đặc biệt,
nó chỉ trông mát mẻ như ký hiệu đô la làm cho jQuery.
Đây chỉ là một người trợ giúp Phương pháp nhấn dấu chấm cuối cùng
thực hiện chính xác điều tương tự.
Và nếu bạn chưa bao giờ sử dụng nó trước khi nhấn JS cả
cho phía khách hàng mã hóa
và phía máy chủ là một thư viện tuyệt vời hữu ích
mà nhiều người mô tả nó thích jQuery chứa tất cả
các phương pháp, những người mong muốn đi kèm với bản thân JavaScript.
OK.
>> Vì vậy, như đẹp, để tôi và Tôi đã xem trong phim,
bạn có như gọi lại như một tham số?
>> Có.
>> Giống như khi bạn thực sự như đẩy trong,
và như những gì nó có nghĩa là khi bạn chỉ cần có
như gọi lại và sau đó làm như -
[Ghi chú không nghe được]
>> OK, câu hỏi hay.
Vì vậy, hãy để tôi kéo lên async trang chính ở đây
hoặc tài liệu trên GetHub.
Vì vậy, đây là kinh điển cấu trúc.
Nếu bạn đang gọi điện bằng cách này loạt phương pháp cụ thể,
có hai phần lớn với nó.
Một là một mảng chức năng ẩn danh
và hai là một cuộc gọi lại thức chức năng mà thực sự
thực hiện tại rất cuối của bộ truyện.
Bây giờ, nếu chúng ta phóng to một gần hơn vào ngày đầu tiên
trong những điều lớn, loạt các chức năng ẩn danh
theo yêu cầu của điều này tài liệu hướng dẫn của anh chàng có
là một vô danh chức năng mà mất
trong một tham số được gọi là gọi lại hoặc foo hoặc thanh, nó không quan trọng
nhưng anh ấy gọi nó gọi lại.
Và đây là loại còi của bạn mà Shake Shack tay bạn.
Đây là phương tiện mà bạn có thể trả về giá trị
cho khách hàng bởi vì bạn có thể không chỉ theo nghĩa đen trở lại.
Bạn phải làm điều đó bằng cách gọi này.
Bởi vì nếu bên trong này chức năng là một số chạy chậm
mã như cơ sở dữ liệu truy vấn, đọc các tập tin từ hệ thống tập tin,
bạn không muốn chờ đợi có và ngăn chặn tất cả mọi người khác,
bạn muốn gọi gọi lại.
Vì vậy, đây là nghĩa đen tên của các đối số.
Nhưng giống như trong C, bạn có con trỏ hàm.
Trong Java bạn có phương pháp hệ thống tài liệu tham khảo
và tương tự ở đây trong JavaScript.
Đây là một biến nhưng kiểu của nó là chức năng.
Vì vậy, chỉ đơn giản bằng cách viết tên của nó có một cuộc gọi lại hoặc foo
hoặc thanh, sau đó mở ngoặc và dấu ngoặc đóng,
bạn đang thực hiện mà về chức năng đó.
Và đi qua một null mà có nghĩa là lỗi vô một
có nghĩa là đây là dữ liệu mà tôi muốn vượt qua in
Và sau đó là đoạn được rõ ràng, đây là gọi lại khác.
Và nó không được gọi là gọi lại,
nó chỉ là một khái niệm chức năng phương pháp gọi lại
bởi vì nó được gọi là theo định nghĩa
thư viện của tác giả này khi toàn bộ series đã hoàn thành
hoặc tập hợp con của nó nếu một lỗi đã xảy ra sớm hơn.
Vì vậy, tên của chức năng gọi lại, gọi chức năng gọi lại,
tên của chức năng gọi lại, gọi chức năng gọi lại,
gọi lại khác nhau hoạt động tất cả cùng nhau.
>> Bây giờ chúng ta có như xác định gọi lại?
>> Không, bởi vì anh chàng này sẽ đi vào mảng của bạn
chức năng của vô danh,
một con trỏ đến mã ông muốn thực hiện.
Chính xác, được rồi.
Vì vậy, hãy nói rằng mã được một chút đơn giản.
Vì vậy, nó có thể.
Và nếu bạn đang như tôi, có thoải mái trong ít nhất là biết,
phải mất một thời gian để quen với điều này.
Nhưng chúng ta có thể làm sạch này lên một chút,
không phải để ném quá nhiều ở bạn nhưng đây là biến thể khác
và sử dụng nó một phương pháp khác
trong cùng một thư viện gọi là thác nước.
Ưu điểm của nó là không giống như hàng loạt trong đó mỗi
của những người vô danh chức năng thực hiện cơ bản
độc lập những nguyên tắc khác.
Thác nước như tên đề nghị cho phép các chức năng cao nhất
để loại vượt qua trong các giá trị với chức năng thấp hơn,
loại như một thác nước.
Vì vậy, xu hướng tăng giá này là tôi có thể loại
của sử dụng để lợi thế của tôi.
Trong async.waterfall, chú ý những điều sau đây.
Tôi chỉ có thể gọi fs.stat đi qua trong con đường
mà tôi muốn để có được số liệu thống kê trên.
Và sau đó nhớ trước khi tôi đã có một chức năng ẩn danh
mà đã có hai đối số sai lầm,
esults và sau đó tôi gọi là chức năng gọi lại bằng tay?
Nói cách khác là chỉ để được rõ ràng, nhớ lại rằng trước đó
trong async 2, tôi đã làm tất cả công việc khó chịu này.
Tôi gọi fs.stat thông qua trong P,
tuyên bố vô danh của riêng tôi chức năng.
Sau đó tôi đã kiểm tra nếu lỗi là không null thì tôi đã làm điều này,
khác tôi đã làm điều đó, toàn bộ vẻ đẹp của quy ước sau đây
như trong Node.js là gọi lại chức năng nói chung có nghĩa là
phải mất ít nhất một đối số, một đối tượng Lỗi tiếp theo không
hoặc giá trị hữu ích hơn.
Vì vậy, nhận thấy mô hình ở đây,
chức năng gọi lại này tôi tuyên bố sau chính xác
mô hình đó của anh chàng này thư viện async không.
Mà là để nói điều này, tại sao Tôi thực hiện cuộc gọi lại của riêng tôi
phương pháp khi tác giả này thư viện là nghĩa đen đưa cho tôi
trên một đĩa có thể nói, một chức năng gọi lại tôi có thể sử dụng?
Vì vậy, tôi chỉ có thể vượt qua trong tham khảo anh cho tôi
để ngay lập tức, một vài dòng của tôi
mã trở thành một dòng mã.
Bây giờ, nơi nào chúng ta đi với điều này?
Chức năng tiếp theo mà Tôi muốn thực hiện,
vô danh tiếp theo chức năng trong mảng này
chức năng nào sau đây.
Thông báo chỉ số đầu tiên là tham số đầu tiên.
Vì vậy, một cái gì đó có thay đổi rồi.
Bây giờ, anh chàng này đã viết thư viện -
và tôi nói chàng bởi vì nó là một chàng trai.
Anh chàng này đã viết thư viện này là đảm bảo tài liệu
rằng nếu chức năng này đây đưa tôi trở lại một đối tượng Lỗi
hoặc null theo sau là một tình trạng hôn mê danh sách phân cách các giá trị khác,
ông sẽ đảm bảo rằng những các giá trị khác là tay
chức năng ẩn danh này theo thứ tự từ trái sang phải.
Và những gì được sử dụng để chỉ một chức năng gọi lại một mình đơn giản
trở thành đối số cuối cùng như vậy.
Bây giờ, tôi không biết những người tôi tập trung vào chỉ cần bạn biết.
Nhưng bây giờ, những gì là lấy đi đây?
Vì vậy, chúng ta biết từ tài liệu
hoặc các cặp vợ chồng trước khi các ví dụ
fs.stat mà cuối cùng hy vọng một cuộc gọi lại với hai đối số,
đối tượng Lỗi đó là một Đối tượng lỗi hoặc null sau
bởi một tài liệu tham khảo số liệu thống kê đối tượng.
Vì vậy, nếu tôi nghĩ về điều đó, Đối tượng lỗi số liệu thống kê tình trạng hôn mê đối tượng,
phù hợp trong mô hình thư viện của người này.
Vì vậy, tôi chỉ có thể nói bởi vì Tôi không có tham số thứ hai
rằng nó - đó là sẽ phải được thông qua bởi fs.stat
để gọi lại là err, số liệu thống kê theo định nghĩa của thư viện này,
Tôi có thể đặt thứ hai tên của đối số ở đây
hoặc bất cứ điều gì tôi có thể đổi tên nó
nếu tôi muốn tiếp bởi gọi lại đây.
Vì vậy, tôi có thể vượt qua một giá từ đây đến đây.
Bây giờ, tất cả các mã này mặc dù phải thừa nhận là hơi khó hiểu là
ít nhất là sao chép dán cho hầu hết các phần từ trước.
Sự khác biệt duy nhất là thông báo ở đây tôi tuyên bố một Lỗi
đối tượng và bây giờ tôi muốn để có được một chút fancier.
Tôi thực sự muốn biết những gì các lỗi được, vì vậy tôi sẽ
để gài bên trong của đối tượng này một tài sản được gọi là mã tùy tiện
để tôi biết rằng đây không phải là một tập tin
cần được cập trái phép, nó là một HTTP 403.
Hãy để tôi nhớ rằng trước khi Tôi vượt qua các đối tượng Lỗi
để gọi lại.
Và sau đó cuối cùng cố gắng đọc các tập tin, vì vậy trong trường hợp này,
thác nước, tôi đã bị hỏng mã từ hai bước lớn
thành ba bước nhỏ hơn.
Nhận thấy vẻ đẹp ở đây,
Tôi có thể gọi fs.readFile đi qua trong con đường.
Và sau đó là phần cứng tinh thần, là tôi chỉ cần vượt qua
trong gọi lại của anh chàng.
Điều anh ta đưa cho tôi, tôi sẽ vượt qua để fs.readFile.
Bởi vì chúng tôi tôn trọng tất cả các công ước cùng,
đối số đầu tiên một cuộc gọi lại là một đối tượng Lỗi hoặc null sau
bởi tình trạng hôn mê hoặc ly thân danh sách các công cụ hữu ích.
Vì vậy, điều đó có nghĩa bây giờ và nếu tôi đọc tài liệu tôi sẽ biết
này, gọi lại cuối cùng, anh chàng này đây bên ngoài
của các dấu ngoặc vuông sẽ được thông qua trong đối tượng Lỗi
hoặc null mà tôi cần phải kiểm tra như mọi khi với mã này ở đây.
Và sau đó theo định nghĩa của phương pháp này
trong tài liệu hướng dẫn của anh chàng, giá trị cuối cùng trở lại
từ phương pháp cuối cùng trong mảng vô danh của tôi -
mảng của tôi về chức năng ẩn danh.
Vì vậy, những gì đọc tập tin trở lại
và tôi đang sử dụng trở lại lỏng lẻo hiện nay.
Tôi có nghĩa là những gì đọc tập tin thông qua như các đối số
với phương pháp gọi lại tay của mình?
Hai đối số, đầu tiên là một đối tượng lỗi hoặc vô giá trị,
đó là hầu như luôn luôn sẽ là câu trả lời.
Và điều thứ hai đang diễn ra là những gì cho đọc tập tin?
Các nội dung của tập tin, dữ liệu như chúng tôi gọi nó trước đó.
Vì vậy, bằng cách đơn giản tuyên bố err, kết quả,
và kiểm tra các lỗi này là loại nhàm chán bây giờ.
Khác, tôi làm res.end đi qua trong kết quả đó.
Điều này sẽ chắc chắn không đồng bộ trong hoàn hảo
cho đến khi bạn thực sự viết nó cho mình.
Nhưng bây giờ, có đi ít nhất là một thực tế
có vẻ như là điều này mô hình phổ biến, theo đó nếu chúng ta
và tác giả của thư viện tất cả các loại thẻ
với quy ước này các phương pháp gọi lại.
Và tham số đầu tiên là một đối tượng Lỗi hoặc null.
Và thứ hai và thứ ba
và đối tượng thứ tư là những điều chúng tôi quan tâm và chúng tôi loại
của tuân theo quy tắc và tài liệu hướng dẫn.
Chúng tôi bắt đầu với mã thật là đẹp, xấu xí.
Và mặc dù gần đây nhất ví dụ là thẳng thắn loại khó
để hết tâm trí bạn, nó ít nhất là trực quan,
có vẻ như nó là chặt chẽ hơn nhiều.
Và một khi bạn có được thoải mái với nó, nó rất dễ dàng hơn nhiều
và nó là như vậy ít nhiều dễ bị lỗi hơn so với ví dụ trước.
Vì vậy, hãy để tôi chứng minh một điều cuối cùng ở đây.
Đây là phiên bản ba.
Và - Không, hãy để này một mình.
Hãy để tôi đi vào một vài điều cuối cùng khác trêu ghẹo.
Được rồi, vì vậy trong máy chủ 2.
OK. Đầu tiên, bất kỳ câu hỏi, Tôi biết điều này là rất nhiều
nhưng bạn muốn có nhiều hơn hướng dẫn, như vậy?
Bạn đã không nói tốt hướng dẫn cần thiết.
Yeah?
[Ghi chú không nghe được]
Chính xác, bạn cơ bản khoan dung cho hệ điều hành
để tìm ra cách để sắp xếp tất cả các quả bóng cùng một lúc,
đọc từ một tập tin, đọc từ một cơ sở dữ liệu.
Và đó là máy chủ JavaScript này bản thân đó là đơn luồng.
Và về cơ bản và thực sự,
có một hình ảnh Tôi không ném lên,
và nó không nhất thiết tất cả những gì làm sáng tỏ
nhưng có lẽ chúng tôi sẽ cung cấp cho bạn một mô hình tâm thần.
Tự JavaScript và nút
đặc biệt có này được gọi là vòng lặp sự kiện.
Theo đó, bạn có thể nghĩ của Node.js, chương trình,
nghĩa đen như một vòng lặp vô hạn.
Nó chỉ là một vòng lặp hoang dã, chờ đợi và chờ đợi và chờ đợi,
tìm kiếm nhiệm vụ để hoàn thành.
Và nhiệm vụ có thể được, đi lấy một cái gì đó từ một cơ sở dữ liệu
hoặc đây là một giá trị từ cơ sở dữ liệu hoặc đi lấy tập tin này
từ đĩa hoặc đây là một yêu cầu từ người sử dụng.
Bất kỳ loại sự kiện, giống như trường hợp trình duyệt điều khiển,
như vậy là máy chủ sự kiện bên lề hướng.
Và bất kỳ những điều tạo sự kiện.
Vì vậy, một người nào đó trong Node.js, chỉ đã viết một vòng lặp vô hạn,
một vòng lặp hoang dã lớn, chờ đợi cho các công cụ để xảy ra.
Và như thứ không xảy ra, nó kết thúc trong một hàng đợi, phải không?
Chắc chắn, một cơ sở dữ liệu có thể trả về giá trị.
Và một hệ thống tập tin, điều hành hệ thống có thể trả về giá trị
ở khoảng thời nhưng có lẽ sẽ
có một số đặt hàng cho họ.
Và Node.js sẽ có bản chất là một hàng đợi
như một mảng lớn hoặc một vector, một số cấu trúc dữ liệu
rằng tất cả các bộ đệm những điều đó.
Bởi vì nó có thể theo nghĩa đen chỉ xử lý một trong số họ tại một thời điểm.
Vì vậy, khi bạn, các nhà phát triển,
văn bản không đồng bộ JavaScript mã sử dụng không đồng bộ
chức năng, bạn đang cho phép này cái gọi là vòng lặp sự kiện đi
để đánh dấu tiếp theo, phải không?
Vì vậy, miễn là bạn ngay lập tức trở lại như tất cả
những phương pháp này không đồng bộ làm như đọc tập tin và các chỉ số,
họ trở về ngay lập tức vì gọi lại cuối cùng
sẽ trở lại.
Ngay sau khi bạn quay trở lại,
đó có nghĩa là người khác có thể được lấy ra khỏi chứng khoán đây
hoặc nó có thể được lấy ra khỏi ở phía trước của hàng đợi ở đây.
Và như vậy, có trong thực tế, tuần tự
tất cả những gì đang xảy ra,
mặc dù tất cả những thứ có thể xảy ra song song
trên một hệ thống đa luồng.
Nhưng chính nó và Node.js các máy chủ đang chạy
là một chủ đề.
Và xuống bên trong đó là t bạn không nhất thiết phải max
ra khỏi máy tính của bạn khả năng là như đặc biệt
nếu bạn có một lõi 16 thậm chí một máy tính 2 lõi
và bạn chỉ cần chạy một thể hiện của nút.
Nhưng nếu bạn đã một lần nữa thực hiện một cái gì đó như 161,
bạn tránh một cơn ác mộng lớn đau đầu khi nói
điều kiện chủng tộc và ổ khóa và semaphore
và viết thật sự đang đa luồng,
để mặt tích cực và tiêu cực.
OK. Vì vậy, trở lại đoạn code ở đây, hãy để tôi đề nghị chúng ta bắt đầu
để đơn giản hóa những điều một chút.
Chúng ta đã thấy một máy chủ một chút trước đó trông như thế này.
Vì vậy, đó là cho là khá đơn giản.
Nhưng cũng giống như trong thế giới của PHP, có khung
như Laravel và có những thứ như Rails và Django,
cùng một điều trong thế giới Node.js.
Và chúng tôi sẽ chi tiêu nhiều hơn thời gian này hôm thứ Tư
và trong các dự án tiếp theo.
Nhưng nếu tôi đi vào một máy chủ 2 thư mục,
nhận thấy một vài mô hình ở đây.
Vì vậy, đây là - có đi là một ví dụ tương đương
nhưng nó sử dụng một khuôn khổ gọi là express.js,
đó là mã nguồn mở miễn phí phần mềm như Rails và Django,
như Laravel, đó là chỉ cuối cùng sẽ
là không được đánh giá ngày hôm nay Vì chúng tôi đã viết
ví dụ đơn giản như vậy.
Nhưng tin tưởng chúng tôi.
Điều này sẽ rất nhanh chóng trở thành người bạn của bạn
bởi vì nó sẽ tiết kiệm bạn rất nhiều mã TDS.
Và một mô hình chung cho một ứng dụng express.js là
để có một app.js hoặc server.js tập tin, trong đó có logic
chương trình của bạn hoặc ít nhất là điểm nhập cảnh.
Bạn có thể có nhiều file.
Một nút mô-đun thư mục con trong đó có các thư viện
mà bạn đã tải về như async
và thể hiện bản thân ở những người khác.
Và sau đó package.json, package.json trông như thế này,
và bạn có thể tạo nó bằng tay hoặc các công cụ tạo nó cho bạn
và đó là nghĩa đen một tập tin JSON
và một phần thú vị là phụ thuộc ở đây.
Cũng giống như trong Laravel, bạn có thư mục đó nhà cung cấp
và bạn phải lo lắng về các gói và làm -
thực sự cập nhật với Thợ thủ công hoặc lệnh tương tự,
các thư viện bạn đã cài đặt,
tương tự với package.json đây và bạn quản lý thư viện
và các phiên bản mà bạn quan tâm.
Vì vậy, nếu tôi có một package.json, Tôi chỉ đơn giản là có thể làm NPM,
Nút Package Manager cài đặt, nó sẽ tự động tìm
tại tập tin package.json.
Nhìn và thấy, tôi có phiên bản mới nhất
của tất cả các mô-đun nhà cung cấp
trong một nút nhấn module thư mục ở đây hoặc có thể
trong một số cha mẹ hoặc người thư mục tổ tiên.
Và nếu không, nó đi để tải về họ
và bạn sẽ thấy một bó toàn bộ
HTTP thứ đang diễn ra trên dây.
Vì vậy, ví dụ, hãy để tôi bạn thấy nội dung
các module nút chỉ để thể hiện.
Hãy để tôi đi trước và mạnh dạn xóa module nút
để tất cả tôi có bây giờ là thế này.
Và nếu tôi NPM cài đặt, bạn sẽ thấy rằng nó sẽ đọc
tập tin và package.json chúng tôi đã nhìn thấy đầu ra tương tự
điều này trong thế giới Laravel.
Nó tải về toàn bộ loạt các công cụ và đó là
vì rõ ràng lần lượt phụ thuộc vào toàn bộ một loạt
các thư viện của những người khác.
Vì vậy, tất cả những là loại được tải về đệ quy.
Cho đến bây giờ, nếu tôi làm trong LS một lần nữa,
có module nút của tôi thư mục trở lại
và thể hiện như sau.
Vì vậy, nó chỉ là một cách đơn giản hóa quản lý gói.
Bây giờ, nếu chúng ta nhìn vào tập tin app.js, điều này sẽ
là một đổi trở lại máy chủ web đầu tiên của chúng tôi
nơi chúng tôi chỉ nhổ ra "hello, thế giới".
Nhưng nhận thấy các mô hình ở đây,
đầu tiên chúng tôi yêu cầu sự đồng ý mô-đun, sau đó chúng tôi có dòng này
mã mà bạn biết từ tài liệu.
Bạn có nghĩa là điều trị bệnh này biến mô-đun như là một chức năng,
nên mở ngoặc đóng ngoặc đơn có nghĩa là thực hiện nó.
Điều đó sẽ rõ ràng trả lại một cái gì đó chúng ta sẽ
thường gọi một ứng dụng.
Làm thế nào nó hoạt động?
Tôi thực sự không biết.
Tôi sẽ để cho người khác, bạn đã biết, trong thế giới hiện viết đó.
Tôi sẽ bây giờ đứng trên vai của mình như vậy là
để làm cho ứng dụng của tôi chạy một chút đơn giản.
Ở đây, tôi sẽ lắng nghe trên cổng đó đặc biệt
đó có thể là bất cứ điều gì nhất.
Và đây là mã đó là có thể gợi nhớ hơn bây giờ
của Laravel và routes.php fil.
Vì vậy, đây là bữa ăn đơn giản, tôi chỉ cần đi để xác định một lộ trình
cho ngôi sao dấu gạch chéo, vì vậy tất cả mọi thứ sẽ được hấp thụ
bởi xử lý yêu cầu này.
Mô hình cho yêu cầu xử lý là chức năng ẩn danh của nó
với một đối số yêu cầu
và một đối tượng phản ứng giống như trước đây.
Và res.send trong phương tiện nhanh bạn gửi mã sau
bởi bất cứ điều gì bạn muốn gửi.
Và tất nhiên, bạn có thể làm điều gì đó fancier
bởi thực sự gửi các tập tin hoặc HTML
hoặc tự động tạo ra nội dung.
Nhưng bây giờ, tất cả chúng tôi đã làm đã được nhổ ra hello, thế giới.
Nếu chúng ta đi vào máy chủ ba, điều này thậm chí fancier chỉ
để cho bạn thấy một số chức năng.
Và chúng tôi sẽ chỉ cho bạn một phiên bản thậm chí còn hấp dẫn hơn
điều này hôm thứ tư.
Nhưng nếu bạn đã từng nghe Socket IO có thể,
vì vậy như tôi nghĩ rằng Jonathan hoặc một người nào đó đã nói trước đó,
một trong những điều nút là thực sự được biết đến
cho là thời gian thực của nó hành vi, phải không?
Hãy suy nghĩ về PHP trong MySQL, nếu bạn là để thực hiện một máy chủ trò chuyện
trong PHP theo đó hai người có thể mở một cửa sổ trình duyệt để foo.com
và sau đó bắt đầu IMing mỗi khác, Alice trong một cửa sổ,
Bob trong khác để mỗi người thấy mình
hoặc tin nhắn của cô trong các cửa sổ khác.
Làm thế nào bạn sẽ làm điều này trong PHP và MySQL?
Sử dụng hoặc không sử dụng Laravel loại của phi vật chất, bạn có thể có
như một tập tin index.php.
Và bạn đã có - trong một số trường hợp nó có nhổ
ra khỏi hình thức, do đó, sẽ là một hình thức HTML
mà có lẽ không nộp thông qua hình thức trình bình thường
nhưng Ajax có thể, phải không?
Vì vậy, một vào trình xử lý, do đó, bạn gõ vào một lĩnh vực văn bản,
bạn nhấn Enter và sau đó nó được gửi đến máy chủ thông qua Ajax.
Những gì làm bạn sau đó làm trên máy chủ?
Vì vậy, bạn đã có index.php
hoặc một cái gì đó chấm PHP đó là nhận được trong tham số HTTP
từ người sử dụng, Alice hay Bob tin nhắn tức thời, bạn sẽ làm gì
với nó để truyền bá nó Bob hay Alice, tương ứng?
Tôi có nghĩa là bạn theo nghĩa đen có các công cụ mà
để làm điều này trong phút của bạn.
Vì vậy, giống như những gì bạn sẽ làm gì?
Bạn có một phút để thực hiện chương trình này.
Yeah?
[Ghi chú không nghe được]
Hoàn hảo. Đúng, vì vậy bạn đã có một cơ sở dữ liệu.
Chúng tôi biết một chút chút về MySQL.
Vì vậy, bạn có một bảng đó là thông điệp,
có thể có một lần tem, một ID người dùng,
cơ thể của tin nhắn tự tạo ra đó,
cập nhật đó và tất cả điều đó.
Vì vậy, bạn lưu trữ trong cơ sở dữ liệu.
Và giả sử Alice gửi thông điệp đầu tiên, làm thế nào Bob được
rằng thông điệp tại từ cơ sở dữ liệu?
>> Nó có thể là một số Ajax phản ứng đó là liên tục đi
trở lại cơ sở dữ liệu đầu nhận được [không nghe được].
>> Chính xác.
Vì vậy, mã của Bob ai đang giống như Alice chỉ là loại
của một mối quan hệ đối xứng,
Trình duyệt của Bob có một số mã Ajax đó có thể là có thể mỗi 30
giây kéo máy chủ thông qua đồng bộ Ajax,
đang có tin nhắn mới?
Có tin nhắn mới?
Mỗi 30 giây sẽ là loại tối ưu
vì ông đã phải chờ đợi thậm chí
nếu Alice nghĩa chỉ cần gửi tin nhắn.
Vì vậy, trình duyệt của Bob có thể mỗi thứ hai đánh máy chủ.
Nhưng điều đó có nghĩa là Alice trình duyệt được đánh máy chủ
mỗi giây.
Những gì về Charlie [Giả chính tả]
và David [giả chính tả] và Edward [giả chính tả]
và mỗi thư khác của bảng chữ cái?
Vấn đề là gì của phương pháp này?
Rất nhiều lượt truy cập quá nhiều -
Tôi có nghĩa là bạn chỉ có hiệu quả Cách dùng từ cái nhìn của riêng bạn
hoặc DDOSing, phân phối Tấn công từ chối dịch vụ
trên trang web của riêng bạn, bởi có tất cả
của những người sử dụng chạy JavaScript mã chỉ ping
heck ra khỏi máy chủ của bạn ngay cả khi số lượng tùy ý,
80 phần trăm thời gian không ai nói bất cứ điều gì
trong phòng chat.
Nhưng bạn chỉ cần kiểm tra để đảm bảo như vậy.
Vì vậy, PHP trong rất nhiều ngôn ngữ là chỉ không tốt
cho thông tin liên lạc thời gian thực.
Bởi vì trong PHP thu hồi có không có bộ nhớ trung tâm, phải không?
Bạn có đối tượng phiên mà tạo ra những ảo ảnh
lưu trữ trung ương nhưng đó là trên một cơ sở cho mỗi người dùng.
Bạn không có bộ nhớ toàn cầu như bạn làm trong một Java Servlet
trong quen thuộc hoặc khác khung làm việc như thế.
Node.js mặc dù, bạn có bộ nhớ toàn cầu vì bạn có
một máy chủ và đó có thể nhớ bất cứ điều gì nó muốn
về tất cả người dùng.
Và bạn có thể vẫn có một cơ sở dữ liệu.
Nhưng điều tốt đẹp về Node.js quá là nó tốt hơn nhiều
hơn một cái gì đó như PHP và tạo ra những ảo ảnh
xử lý nhiều việc cùng một lúc.
Và trong thực tế như trong sang một bên, bạn có thể thực hiện các máy chủ trò chuyện trong PHP,
nhưng bạn thường sẽ làm gì một cái gì đó gọi là bỏ phiếu dài
nhờ đó mà bạn không ping các máy chủ mỗi thứ hai.
Bạn ping máy chủ, máy chủ không đáp ứng với bạn
cho trở lên của 30 giây, nó đã ngồi
trong một vòng lặp chờ đợi và chờ đợi.
Và máy chủ kiểm tra nếu có dữ liệu mới trong cơ sở dữ liệu
và chỉ một lần nó, bạn thấy, "Ồ, đây là một thông điệp từ Bob, "
nó trả lời máy chủ HTP?
Vì vậy, các hiệu ứng trong trình duyệt của bạn là biểu tượng trình duyệt IE hoặc Mozilla
hoặc bất cứ điều gì chỉ cần giữ quay trong 30 giây tại một thời điểm.
Nhưng ngược là, bạn không có 30 yêu cầu kết nối
trong 30 giây, bạn có một.
Vì vậy, nó được gọi là bỏ phiếu dài.
Nhưng thậm chí tốt hơn trong các trang web hiện đại trình duyệt là một cái gì đó gọi là
WebSocket, mà bạn đi CS143,
bạn có hiệu quả có thể làm cho một Kết nối TCP từ một khách hàng
như một trình duyệt tới một máy chủ và sau đó bám vào nó
mà không sử dụng gần như nhiều tài nguyên
như HTTP truyền thống có thể làm.
Và Socket IO là một thư viện Node.js
mà làm cho nó dễ dàng hơn để làm cho các kết nối ổ cắm
hoặc ảo tưởng có tại cho các trình duyệt cũ
để bạn có thể thực hiện điều này chức năng thời gian thực của.
Vì vậy, đây là một ví dụ.
Công cụ này lên hàng đầu được một hơn chút phức tạp
nhưng nó chủ yếu là sao chép và dán từ tài liệu socket.io 's.
Ở đây bây giờ là một hơn yêu cầu xử lý chính xác.
Nếu người dùng yêu cầu một cắt giảm, những tập tin tôi đi
là rõ ràng phục vụ lên với họ?
Index.html.
Và có một số mới thứ ở đây dòng
mà tôi sẽ chỉ cho bạn chỉ trong một thời điểm.
Nhưng điều này chỉ là một cách khác
của grabbing một tập tin một ít hiệu quả hơn
hơn là chỉ làm fs.readFile.
Đó là một chút thông minh hơn đặc biệt là cho các tập tin lớn.
Vì vậy, câu chuyện dài ngắn, những dòng này chỉ để phục vụ
một tập tin có tên index.htm
mà bây giờ giả sử có chứa dạng HTML mà Alice
và Bob có thể liên lạc.
Cuối cùng, io.sockets.on, vì vậy đây xuất phát từ dòng này lên đây.
Vì vậy, tôi chỉ đọc tài liệu io.socket mang lại cho tôi
truy cập vào một cái gọi là WebSocket với một trình duyệt,
giữa các trình duyệt và máy chủ.
Tôi đang lắng nghe đặc biệt kết nối sự kiện mà phương tiện
khi người sử dụng đầu tiên truy cập máy chủ cố gắng
mở kết nối này, tôi sẽ gọi cuộc gọi này trở lại.
Và bây giờ, tôi sẽ làm như sau.
Mỗi năm giây, những gì tôi sẽ làm gì?
Tôi sẽ phát ra, phát sóng nếu bạn nhớ đầu,
ngôn ngữ đồ họa sẽ rằng một khối phát sóng?
Vì vậy, bạn sẽ phát ra
hoặc kích hoạt một sự kiện được gọi là tùy tiện từ máy chủ.
Và nó sẽ chứa một Ping nhắn
và ngày hiện tại.
Vì vậy, đây là một thực tế máy chủ trò chuyện Alice
và Bob có thể sử dụng, nhưng đó là loại của một máy chủ trò chuyện tự động
nơi các thông điệp ping chỉ là loại sonar.
Nó chỉ hẹn hò vào các thời điểm mà được gửi đi mỗi năm giây.
Vì vậy, nếu tôi thực sự chạy này điều - và đó là nó.
Để được rõ ràng ở đây, thông báo điều này chỉ được đăng ở đây.
Vì vậy, hãy để tôi quay một nhắm mắt làm ngơ để đó.
Hãy để tôi làm nút của app.js.
Hãy để tôi vào trình duyệt của mình.
Nạp lại trang chủ ở đây.
[Tạm dừng]
Và cho tôi đóng thanh tra.
Mỗi năm giây, tôi có một trình diễn mặc dù không
tương tác cho con người
của một cái gì đó xảy ra không đồng bộ.
Trong thông báo trình duyệt, không có biểu tượng quay.
Đó là sử dụng một tính năng fancier của Chrome trong các trình duyệt hiện đại
duy trì một ổ cắm kết nối bên dưới mui xe
và đó là những gì được gọi là nói chung là một mô hình pub / sub,
xuất bản / đăng ký mô hình, nơi chúng tôi đã không được thực hiện
đó khá rõ ràng ở đây.
Nhưng những gì là tốt đẹp về điều này quán rượu chung / sub mô hình là
bạn có thể có một nhà xuất bản.
Trong trường hợp này máy chủ trung tâm và tất cả
của cá nhân các trình duyệt khách hàng.
Alices và Bobs của thế giới có thể đăng ký với nó,
để bạn có thể chuyển tiếp tin nhắn trong bất kỳ số lượng người sử dụng.
Và mặc dù một lần nữa chúng tôi không nhìn thấy tương tác,
chúng tôi đã có thể 12 dòng lệnh chỉ để làm điều này.
Và nó có thể không phải là một bước nhảy vọt để tưởng tượng làm thế nào bạn có thể whip
ra các tập tin index.html có một hình thức HTML thực sự,
chút mã jQuery với Ajax không gửi ban ngày
nhưng chỉ cần gửi bất cứ điều gì Alice hoặc Bob loại đến máy chủ
và sau đó máy chủ sẽ chuyển tiếp nó ra.
Và tôi hứa sẽ cái nhìn thoáng qua tại một điều cuối cùng chỉ
trêu chọc bạn với điều này.
Nếu chúng ta đi vào dòng không và một,
bạn sẽ thấy mã mà chỉ một chút khác nhau ở đây.
Chỉ cần để bạn đã nhìn thấy nó, đây là một sự thay thế
với những gì tôi gọi là fs.readFile phương pháp trước đó, theo đó,
bạn có thể nói Node.js, "Đi đọc tập tin này vào bộ nhớ.
Nhưng nếu nó là lớn, chỉ cần cung cấp cho tôi một đoạn tại một thời điểm. "
Và bạn có thể biết từ CS165
hoặc 161 hệ thống tập tin có khác nhau
tính hiệu suất.
Bạn có thể muốn đọc trong khối 512 byte
hoặc 2 kilobyte hoặc bất cứ điều gì.
Đây là một cách tối ưu hóa của việc trở lại của tập tin lặp đi lặp lại
để bạn có thể nhổ nó ra nhanh hơn một chút
cho trình duyệt hoặc ai cho khách hàng cuối cùng là.
Vì vậy, số lượng lớn các nội dung ngày hôm nay và chúng ta sẽ đi sâu
vào chi tiết hơn vào ngày thứ Tư với Tim [giả chính tả]
đặc biệt là nhìn vào cách chúng tôi có thể dịch một số ý tưởng
từ nửa đầu Tất nhiên Laravel và các mô hình
vào một thư viện mà bản thân ông đã viết được gọi là Bookshelf.js
được ngày càng trở nên phổ biến trong cộng đồng
bởi vì nó cung cấp cho bạn hầu hết của nó,
nếu không được lớn hơn chức năng của hùng biện
trong đó thu hồi là cái nhìn sâu sắc của thư viện Laravel,
để thêm vào đó và nhiều hơn nữa như thế nào
để phát triển đầy đủ chính thức ứng dụng vào thứ tư.
Chúng tôi sẽ giúp bạn thấy sau đó.