09/10/2018, 23:05

rắc rối với setTimeout

Mình có 1 2 function (vd A() và B() ) trong có dùng hàm setTimeout và mình muốn khi nào hàm A() thực thi xong sẽ đến hàm B() nhưng khi mình gọi
A();
B();
thì hàm A() thực thi chưa xong thì hàm B() đã chạy luôn rồi. Có bạn nào biết sử dụnng hàm setTimeout ko xin chỉ giúp
kid08 viết 01:16 ngày 10/10/2018
hơ, mình nghĩ nó duyệt từ trên xuống dưới chứ nhỉ, setTimeOut là bạn gọi lại chính function hoặc biến nào đó trong 1 khoảng thời gian nhất định
vanlang viết 01:22 ngày 10/10/2018
bạn TA có thể dùng semaphore mà xử lý cho tình huống này
cách thức sử dụng thì bạn tham khảo trong msdn nhé
NsT viết 01:17 ngày 10/10/2018
hì mình nghĩ cách bạn gọi
A();
B();
như vậy là ko chính xác theo yêu cầu của bạn. Bởi nó sẽ lần lượt chạy từng function A, B.

Nếu bạn muốn chạy A() rồi một lúc sau chạy B() thì bạn làm như sau:

function A()
{
// code here
setTimeout("B()",5000);
}

function B()
{
// some code here
}

Và khi gọi bạn chỉ cần gọi:
A();

A() sẽ chạy, 5 giây sau B() sẽ chạy
NDThuan viết 01:22 ngày 10/10/2018
thử dùng cái flag xem sao;

Code:
var processCompleted = false;

function A() {
   //thực hiện

   //Sau khi thực hiện xong chức năng chính thì set flag thành true
   processCompleted = true;
}

// thực thi hàm A()
eval('A()');
//nếu hàm A đã hoàn thành thì thực thi hàm B
if (processCompleted) eval('B()');
đó chỉ là suy luận còn có chạy hay không mình kô biết
kid08 viết 01:19 ngày 10/10/2018
hì thế cho hỏi luôn là cái hàm eval dùng để làm gì thế
MichaelTuanAnh viết 01:11 ngày 10/10/2018
Quote Được gửi bởi NDThuan
thử dùng cái flag xem sao;

Code:
var processCompleted = false;

function A() {
   //thực hiện

   //Sau khi thực hiện xong chức năng chính thì set flag thành true
   processCompleted = true;
}

// thực thi hàm A()
eval('A()');
//nếu hàm A đã hoàn thành thì thực thi hàm B
if (processCompleted) eval('B()');
đó chỉ là suy luận còn có chạy hay không mình kô biết
dùng flag rtong trường hợp này cũng không được bạn ạ vì khi dùng hàm setTimeout nó sẽ delay trong khoảng thời gian DELAY, trong thời gian delay đó nó sẽ gọi hàm bên dưới.
kid08 viết 01:17 ngày 10/10/2018
ý của bạn NDThuan là chỉ đểthuwcj hiện lần lượt hàm A rồi đến B chứ ko dùng setTimeOut
NsT viết 01:19 ngày 10/10/2018
Quote Được gửi bởi MichaelTuanAnh
dùng flag rtong trường hợp này cũng không được bạn ạ vì khi dùng hàm setTimeout nó sẽ delay trong khoảng thời gian DELAY, trong thời gian delay đó nó sẽ gọi hàm bên dưới.
Vậy bạn đã thử cách của mình chưa?
teleit viết 01:08 ngày 10/10/2018
Quote Được gửi bởi NDThuan
thử dùng cái flag xem sao;

Code:
var processCompleted = false;

function A() {
   //thực hiện

   //Sau khi thực hiện xong chức năng chính thì set flag thành true
   processCompleted = true;
}

// thực thi hàm A()
eval('A()');
//nếu hàm A đã hoàn thành thì thực thi hàm B
if (processCompleted) eval('B()');
đó chỉ là suy luận còn có chạy hay không mình kô biết
Bạn suy luận thì đúng đấy và rất chuẩn nữa là đằng khác, nhưng rất tiếc là máy sẽ chạy sai bạn à. sai vì bạn dùng hàm if() đấy. trong trường hợp nó kiểm tra processcompleted = false thì nó bỏ qua luôn hàm B() ka ka ka... vậy cách giải quyết đơn giản là bạn thay if() bằng for hoặc while
thân

à quên, nếu mình nhớ không lầm thì hàm eval() dùng để chuyển đổi string sang interger đấy, nhưng bạn quên gán biến cho nó rồi, chẳng hạn như processcompleted = eval('A()'); , hoặc dùng một biến khác, sau đó dùng biến này trong câu điều kiện.
Bài liên quan
0