Tôi có một chức năng thực hiện một số cuộc gọi DDBB, vì vậy nó không đồng bộ.
Tôi cần gọi hàm và kiểm tra giá trị dữ liệu (người chiến thắng) trong đối tượng JSON mà nó trả về. Nếu đó là sự thật, tôi cần gọi lại chức năng cho đến khi người thắng cuộc == sai.
Tôi không thể sử dụng trong khi vì nó không đồng bộ, làm thế nào tôi có thể làm điều này?
someFunction(function(result) { // if result.winner == true repeat })Hỏi ngày 21 tháng 12 năm 2014 lúc 11:53Dec 21, 2014 at 11:53
3
Bạn có thể gọi cùng một chức năng gọi lại cho đến khi điều kiện là true:
someFunction(function repeat(result) { if (result.winner) { someFunction(repeat); } });Kiểm tra bản demo dưới đây.
someFunction(function repeat(result) { document.body.innerHTML += '<br>' + result.winner; if (result.winner) { someFunction(repeat); } }); var results = [true, true, true, false]; function someFunction(callback) { setTimeout(function() { callback({winner: results.shift()}); }, (Math.random() + 1) * 1000 | 0); }
Đã trả lời ngày 21 tháng 12 năm 2014 lúc 12:17Dec 21, 2014 at 12:17
DFSQDFSQdfsq
Phù bằng vàng 190K2525 gold badges232 silver badges254 bronze badges
Bạn đã xem Async.js chưa? Nó có một số chức năng Async dòng điều khiển. Bạn có thể muốn nhìn vào trong khi, dowhilst, cho đến khi, dountil:
//github.com/caolan/async#whilst
whilst(test, fn, callback)Nhiều lần gọi FN, trong khi bài kiểm tra trả về đúng. Cuộc gọi gọi lại khi dừng hoặc xảy ra lỗi.
Đã trả lời ngày 22 tháng 12 năm 2014 lúc 14:32Dec 22, 2014 at 14:32
YuraayuraaYuraA
673 huy hiệu đồng3 bronze badges
Gọi một hàm bên trong một hàm khác #
Để gọi một hàm bên trong một hàm khác, hãy xác định hàm bên trong hàm bên ngoài và gọi nó. Khi sử dụng từ khóa someFunction(function repeat(result) { if (result.winner) { someFunction(repeat); } }); 0, hàm được nâng lên trên cùng của phạm vi và có thể được gọi từ bất cứ nơi nào bên trong hàm bên ngoài.
Copied!
function outerFunc(a, b) { function innerFunc(a, b) { return a + b; } const result = innerFunc(a, b); return result; } console.log(outerFunc(10, 10)); // 👉️ 20 console.log(outerFunc(10, 20)); // 👉️ 30Ví dụ sau đây cho thấy cách chúng ta có thể gọi hàm bên trong trước khi được khai báo. Điều này là do cách nâng cao hoạt động trong JavaScript.
Copied!
function outerFunc() { const num1 = 5; const num2 = 10; // 👇️ call inner function before it's declared const result = innerFunc(); function innerFunc() { return num1 + num2; } return result; } console.log(outerFunc()); // 👉️ 15Điều này chỉ hoạt động cho các chức năng được khai báo bằng cách sử dụng từ khóa someFunction(function repeat(result) { if (result.winner) { someFunction(repeat); } }); 0 (không phải là chức năng mũi tên).
Bạn có thể tưởng tượng rằng tuyên bố của hàm được nâng lên đỉnh của phạm vi, do đó nó có thể được gọi từ bất cứ nơi nào trong phạm vi.
Một cách tiếp cận khác là trả về hàm bên trong từ bên ngoài.
Copied!
function outerFunc() { function innerFunc(a, b) { return a + b; } return innerFunc; } const innerFunc = outerFunc(); console.log(innerFunc(2, 3)); // 👉️ 5 console.log(innerFunc(3, 3)); // 👉️ 6Lưu ý rằng chúng tôi đã không sử dụng dấu ngoặc đơn someFunction(function repeat(result) { if (result.winner) { someFunction(repeat); } }); 2 để gọi hàm bên trong bên ngoài.
Chúng tôi đã trả lại chức năng mà không cần gọi nó. Nói cách khác, chúng tôi đã trả lại một tham chiếu đến hàm bên trong, không phải là kết quả của việc gọi nó.
Điều này cho phép chúng tôi gọi chức năng bên trong nhiều lần khi cần thiết, chuyển các tham số khác nhau mỗi lần.
Điều hữu ích nhất trong kịch bản này là hàm bên trong nhớ các biến được khai báo ở hàm bên ngoài giữa các lời mời.
Copied!
function outerFunc() { const z = 100; function innerFunc(a, b) { return a + b + z; } return innerFunc; } const innerFunc = outerFunc(); console.log(innerFunc(2, 3)); // 👉️ 105 console.log(innerFunc(3, 3)); // 👉️ 106Lưu ý rằng hàm bên trong nhớ lại giá trị của biến someFunction(function repeat(result) { if (result.winner) { someFunction(repeat); } }); 3 giữa các lần gọi.
Khái niệm này được gọi là đóng cửa trong JavaScript.
Hàm bên trong được gói với các tài liệu tham khảo về trạng thái xung quanh.
Điều này có nghĩa là hàm bên trong có quyền truy cập vào các biến được khai báo bên trong phạm vi của hàm bên ngoài bất cứ lúc nào.
Điều này rất hữu ích trong nhiều kịch bản khác nhau. Ví dụ: bạn có thể chuyển một tham số cho hàm bên ngoài mà nó sẽ nhớ cho bất kỳ cuộc gọi hàm bên trong nào.
Copied!
function outerFunc(a) { function innerFunc(b, c) { return a + b + c; } return innerFunc; } const innerFunc = outerFunc(10); console.log(innerFunc(1, 1)); // 12 console.log(innerFunc(1, 2)); // 13Chúng tôi đã vượt qua someFunction(function repeat(result) { if (result.winner) { someFunction(repeat); } }); 4 dưới dạng tham số cho hàm bên ngoài và lưu trữ kết quả trong một biến.
Biến someFunction(function repeat(result) { if (result.winner) { someFunction(repeat); } }); 5 lưu trữ một tham chiếu đến hàm someFunction(function repeat(result) { if (result.winner) { someFunction(repeat); } }); 5, trong đó biến someFunction(function repeat(result) { if (result.winner) { someFunction(repeat); } }); 7 trỏ đến giá trị someFunction(function repeat(result) { if (result.winner) { someFunction(repeat); } }); 4.
Bây giờ chúng ta có thể bỏ qua someFunction(function repeat(result) { if (result.winner) { someFunction(repeat); } }); 4 từ các tham số khi gọi hàm bên trong.
Đọc thêm #
- Cách gọi hàm bên trong một đối tượng trong JavaScript
- Kiểm tra xem một hàm trả về một lời hứa trong JavaScript