Ok, vậy hãy bắt đầu với mã của bạn. Tôi đã thêm một vài nhận xét vào nó, vì vậy bây giờ bạn có thể hiểu nguồn gốc của sự cố:
var A = new XMLHttpRequest(); //You create an XMLHttpRequest object
var B = new XMLHttpRequest(); //And an another
A.open("GET", directory, true);
/* Now you open a GET request to DIRECTORY, with async TRUE. The third parameter can
make a request sync or async, but sync is not recommended as described below. */
A.onreadystatechange = function() {
if (A.readyState === 4) {
if (A.status === 200 || A.status == 0) {
/* So you registered an event listener. It runs when the readyState changes.
You can use it to detect if the request is finished or not. If the readyState is
4, then the request is finished, if the status code is 200, then the response is
OK. Here you can do everythin you want after the request. */
}
}
}
A.send(null); //Now you send the request. When it finishes, the event handler will
// do the processing, but the execution won't stop here, it immediately goes to the
// next function
while(true){ // Infinite loop
B.open("GET", another_directory, false); //Open request B to ANOTHER_DIRECTORY,
// but now, request B will be synchronous
B.overrideMimeType("application/document"); // Configure mime type
B.send(null); // Send the request
if (B.status == "404")
continue;
// If it's not found, then go to the next iteration
// and do something else
}
Tôi hy vọng rằng bây giờ bạn có thể thấy nguồn gốc của vấn đề. Khi bạn chạy tập lệnh này, khi đó bạn bắt đầu yêu cầu không đồng bộ và sau đó bắt đầu ngay lập tức. Bây giờ bạn có thể chọn từ 2 cách.
Chạy yêu cầu tiếp theo từ gọi lại (được khuyến nghị)
Đó là cách tốt hơn. Vì vậy, bắt đầu yêu cầu đầu tiên (không đồng bộ) của bạn và trong trình xử lý sự kiện (nơi bạn thực hiện việc xử lý), bạn có thể bắt đầu yêu cầu tiếp theo. Tôi đã thực hiện một ví dụ bình luận ở đây: http://jsfiddle.net/5pt6j1mo/1/
(Bạn có thể làm điều đó mà không cần mảng - đó chỉ là một ví dụ)
Nếu bạn sử dụng cách này thì giao diện sẽ không đóng băng cho đến khi bạn đang chờ đợi để trả lời. Tất cả mọi thứ sẽ chịu trách nhiệm, do đó bạn có thể tương tác với trang web, bạn có thể tạo nút hủy vv
Synchronous AJAX (không khuyến khích)
tôi không khuyên bạn nên nó bởi vì "XMLHttpRequest Synchronous trên thread chính bị phản đối "trong Chrome, nhưng nếu bạn thực sự muốn thì bạn có thể thử sử dụng giải pháp này. Vì vậy, chức năng mở một của XMLHttpRequest có 3 đối số:
- PHƯƠNG PHÁP: đó HTTP methid sử dụng
- URL: mà URL để yêu cầu
- ASYNC: yêu cầu không đồng bộ? Nếu sai sau đó nó sẽ được đồng bộ mà có nghĩa là sau khi bạn gọi .send(), nó sẽ tạm dừng thực hiện cho đến khi phản ứng trở lại.
Vì vậy, nếu bạn đặt tham số thứ ba thành FALSE thì bạn có thể dễ dàng thực hiện ... nhưng bạn không nên!
Javascript là Không đồng bộ. Bạn cần tìm hiểu về callbacks ... thực hiện chức năng, sau khi hoàn thành gọi lại chức năng B ... – zipzit
tùy thuộc vào trình duyệt bạn đang sử dụng và nếu việc bạn làm sẽ không được sử dụng thực sự sớm, và đặc biệt nếu đây là cho chính mình, tôi khuyên bạn nên học cách sử dụng 'fetch': http://updates.html5rocks.com/2015/03/introduction-to-fetch –