Tôi đã xây dựng một trình thông dịch C trong C# một thời gian trước và bây giờ đã bắt đầu chuyển đổi nó sang Javascript. Mọi thứ đều ổn cho đến khi tôi nhận ra js không có chức năng ngủ. Trình thông dịch của tôi sử dụng một trình phân tích cú pháp đệ quy và nó tạm dừng cho đầu vào của người dùng trong khi nó được lồng vào một số hàm sâu (trong C# tôi đã sử dụng waithandle trong một luồng thứ hai). Tôi đã xem setInterval và setTimeout nhưng chúng không đồng bộ/không bị chặn; tất nhiên một busywait là ra khỏi câu hỏi và tôi nhìn vào một thực hiện timed_queue tôi tìm thấy trên SO nhưng không có may mắn. Tôi đã thử trình phân tích cú pháp cả trong cửa sổ chính và trong một webworker. Tôi đang sử dụng jQuery. Tôi có kinh nghiệm hạn chế với js và đang tìm kiếm ý tưởng để theo đuổi. Tôi biết rất ít về phong cách tiếp tục đi qua, hoặc năng suất và tôi tự hỏi nếu họ có thể giữ chìa khóa. Dưới đây là một chút cắt từ mã để hiển thị một số các controlscript. Bất kỳ ý tưởng xin vui lòng ...javascript vòng lặp lồng nhau chờ người dùng nhập
var STATE = {
START: "START",
RUN: "RUN", //take continuous steps at waitTime delay
STEP: "STEP", //take 1 step
PAUSE: "PAUSE",//wait for next step command
STOP: "STOP",
ERROR: "ERROR"
}
var state = state.STOP;
function parsing_process() //long process we may want to pause or wait in
{
while(token !== end_of_file)//
{
//do lots of stuff - much of it recursive
//the call to getNextToken will be encountered a lot in the recursion
getNextToken();
if (state === STATE.STOP)
break;
}
}
function getNextToken()
{
//retrieve next token from lexer array
if (token === end_of_line)
{
//tell the gui to highlight the current line
if (state === STATE.STOP)
return;
if (state === STATE.STEP)//wait for next step
{
//mimick wait for user input by using annoying alert
alert("click me to continue")
}
if (state === STATE.RUN) {
//a delay here - set by a slider in the window
//a busy wait haults processing of the window
}
}
}
Tôi đã nhận này để làm việc trong Firefox sử dụng task.js
<html>
<head>
<title>task.js examples: sleep</title>
<script type="application/javascript" src="task.js"></script>
</head>
<body>
Only works in FIREFOX
<button onclick="step()">Step</button>
<button onclick="run()">Run</button>
<button onclick="stop()">Stop</button>
<pre style="border: solid 1px black; width: 300px; height: 200px;" id="out">
</pre>
<script type="application/javascript;version=1.8">
function start() {
process();
}
function step() {
if (state === STATE.STOP)
start();
state = STATE.STEP;
}
function run() {
if (state === STATE.STOP)
start();
state = STATE.RUN;
}
function stop() {
state = STATE.STOP;
}
var STATE = {
START: "START",
RUN: "RUN", //take continuous steps at sleepTime delay
STEP: "STEP", //take 1 step
PAUSE: "PAUSE",//wait for next step command
STOP: "STOP",
ERROR: "ERROR"
}
var state = STATE.STOP;
var sleepTime = 500;
function process() {
var { spawn, choose, sleep } = task;
var out = document.getElementById("out");
var i=0;
out.innerHTML = "i="+i;
var sp = spawn(function() {
while(state !== STATE.STOP)
{
i++;
out.innerHTML = "i="+i;
if (state === STATE.RUN)
{
yield sleep(sleepTime);
}
if (state === STATE.STEP)
state = STATE.PAUSE;
while (state===STATE.PAUSE)
{
yield;
}
}
});
}
</script>
</body>
</html>
tôi sẽ đánh giá cao nếu ai đó biết điều gì đó về những lời hứa có thể cho tôi một số manh mối hơn. Ứng dụng của tôi không phải là một người tiêu dùng một nhưng nó sẽ được tốt đẹp nếu nó chạy trong hơn Firefox
Bạn đang chạy môi trường gì? Sự vắng mặt của một chức năng 'ngủ 'chủ yếu là một điều * môi trường *, không phải là một thứ ngôn ngữ. –
Bạn nên sử dụng lời hứa. – SLaks
Bạn có thể giải thích cách sử dụng này, tức là, mục đích là gì? – Roberto