Tôi đang cố gắng sử dụng các tính năng không đồng bộ mới và tôi hy vọng việc giải quyết vấn đề của mình sẽ giúp ích cho những người khác trong tương lai. Đây là mã của tôi đang hoạt động:
async function asyncGenerator() {
// other code
while (goOn) {
// other code
var fileList = await listFiles(nextPageToken);
var parents = await requestParents(fileList);
// other code
}
// other code
}
function listFiles(token) {
return gapi.client.drive.files.list({
'maxResults': sizeResults,
'pageToken': token,
'q': query
});
}
Vấn đề là, vòng lặp while của tôi chạy quá nhanh và tập lệnh gửi quá nhiều yêu cầu mỗi giây đến API google. Vì vậy, tôi muốn xây dựng một chức năng ngủ để làm chậm yêu cầu. Vì vậy, tôi cũng có thể sử dụng chức năng này để trì hoãn các yêu cầu khác. Nếu có cách nào khác để trì hoãn yêu cầu, vui lòng cho tôi biết.
Dù sao, đây là mã mới của tôi không hoạt động. Phản hồi của yêu cầu được trả lại cho hàm async ẩn danh trong setTimeout, nhưng tôi không biết làm cách nào để có thể trả lại phản hồi cho hàm sleep. vào hàm asyncGenerator ban đầu.
async function asyncGenerator() {
// other code
while (goOn) {
// other code
var fileList = await sleep(listFiles, nextPageToken);
var parents = await requestParents(fileList);
// other code
}
// other code
}
function listFiles(token) {
return gapi.client.drive.files.list({
'maxResults': sizeResults,
'pageToken': token,
'q': query
});
}
async function sleep(fn, par) {
return await setTimeout(async function() {
await fn(par);
}, 3000, fn, par);
}
Tôi đã thử một số tùy chọn: lưu trữ phản hồi trong một biến toàn cục và trả lại nó từ hàm sleep, gọi lại trong hàm ẩn danh, v.v.
sleep
Hàm của bạn không hoạt động vì setTimeout
không (chưa?) Trả về một lời hứa có thể được chỉnh sửa await
. Bạn sẽ cần phải quảng bá nó theo cách thủ công:
function timeout(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function sleep(fn, ...args) {
await timeout(3000);
return fn(...args);
}
Btw, để làm chậm vòng lặp của bạn, bạn có thể không muốn sử dụng một sleep
hàm thực hiện cuộc gọi lại và định nghĩa nó như thế này. Tôi muốn khuyên bạn nên làm điều gì đó như
while (goOn) {
// other code
var [parents] = await Promise.all([
listFiles(nextPageToken).then(requestParents),
timeout(5000)
]);
// other code
}
cho phép tính toán parents
mất ít nhất 5 giây.
Kể từ Node 7.6 , bạn có thể kết hợp các hàm promisify
chức năng từ mô-đun utils với setTimeout()
.
const sleep = require('util').promisify(setTimeout)
const sleep = m => new Promise(r => setTimeout(r, m))
(async () => {
console.time("Slept for")
await sleep(3000)
console.timeEnd("Slept for")
})()
Cách nhanh chóng, một lớp lót
await new Promise(resolve => setTimeout(resolve, 1000));
setTimeout
không phải là một async
hàm, vì vậy bạn không thể sử dụng nó với ES7 async-await. Nhưng bạn có thể triển khai sleep
chức năng của mình bằng cách sử dụng ES6 Promise :
function sleep (fn, par) {
return new Promise((resolve) => {
// wait 3s before calling fn(par)
setTimeout(() => resolve(fn(par)), 3000)
})
}
Sau đó, bạn sẽ có thể sử dụng sleep
chức năng mới này với ES7 async-await:
var fileList = await sleep(listFiles, nextPageToken)
Xin lưu ý rằng tôi chỉ trả lời câu hỏi của bạn về việc kết hợp ES7 async / await với setTimeout
, mặc dù nó có thể không giúp giải quyết vấn đề của bạn với việc gửi quá nhiều yêu cầu mỗi giây.
Cập nhật: Các phiên bản node.js hiện đại có triển khai thời gian chờ không đồng bộ buid-in, có thể truy cập thông qua trình trợ giúp use.promisify :
const {promisify} = require('util');
const setTimeoutAsync = promisify(setTimeout);
Nếu bạn muốn sử dụng cùng một loại cú pháp như setTimeout
bạn có thể viết một hàm trợ giúp như sau:
const setAsyncTimeout = (cb, timeout = 0) => new Promise(resolve => {
setTimeout(() => {
cb();
resolve();
}, timeout);
});
Sau đó, bạn có thể gọi nó như vậy:
const doStuffAsync = async () => {
await setAsyncTimeout(() => {
// Do stuff
}, 1000);
await setAsyncTimeout(() => {
// Do more stuff
}, 500);
await setAsyncTimeout(() => {
// Do even more stuff
}, 2000);
};
doStuffAsync();
Tôi đã nêu ý chính: https://gist.github.com/DaveBitter/f44889a2a52ad16b6a5129c39444bb57
var testAwait = function () {
var promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Inside test await');
}, 1000);
});
return promise;
}
var asyncFunction = async function() {
await testAwait().then((data) => {
console.log(data);
})
return 'hello asyncFunction';
}
asyncFunction().then((data) => {
console.log(data);
});
//Inside test await
//hello asyncFunction
Đây là phiên bản của tôi với nodejs vào năm 2020 trong AWS labdas
const sleep = require('util').promisify(setTimeout)
async function f1 (some){
...
}
async function f2 (thing){
...
}
module.exports.someFunction = async event => {
...
await f1(some)
await sleep(5000)
await f2(thing)
...
}
Bạn có thể await setTimeout
với Node.js 15 trở lên:
const timersPromises = require('timers/promises');
(async () => {
const result = await timersPromises.setTimeout(2000, 'resolved')
// Executed after 2 seconds
console.log(result); // "resolved"
})()
API Timers Promises: https://nodejs.org/api/timers.html#timers_timers_promises_api (thư viện đã được tích hợp sẵn trong Node)
Lưu ý: Tính ổn định: 1 - Không khuyến khích sử dụng tính năng này trong môi trường sản xuất.
Mã sau hoạt động trong Chrome và Firefox và có thể các trình duyệt khác.
function timeout(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function sleep(fn, ...args) {
await timeout(3000);
return fn(...args);
}
Nhưng trong Internet Explorer, tôi gặp lỗi Cú pháp cho "(resolve **=>** setTimeout..."
Tạo ra một ứng dụng lấy cảm hứng từ câu trả lời của Dave
Về cơ bản được truyền trong một done
cuộc gọi lại để gọi khi hoạt động kết thúc.
// Function to timeout if a request is taking too long
const setAsyncTimeout = (cb, timeout = 0) => new Promise((resolve, reject) => {
cb(resolve);
setTimeout(() => reject('Request is taking too long to response'), timeout);
});
Đây là cách tôi sử dụng nó:
try {
await setAsyncTimeout(async done => {
const requestOne = await someService.post(configs);
const requestTwo = await someService.get(configs);
const requestThree = await someService.post(configs);
done();
}, 5000); // 5 seconds max for this set of operations
}
catch (err) {
console.error('[Timeout] Unable to complete the operation.', err);
}
await setTimeout(()=>{}, 200);
Sẽ hoạt động nếu phiên bản Node của bạn là 15 trở lên.
Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.
Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?
Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.
Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.
The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!
Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.
Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?
Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.
Edward Norton đã muốn đưa cuốn tiểu thuyết Motherless Brooklyn của Jonathan Lethem's Joycean 1999 lên màn ảnh kể từ khi nó được xuất bản. Bây giờ, 20 năm sau, một đoạn giới thiệu đã xuất hiện cho câu chuyện sôi nổi, đưa câu chuyện của Lethem trở lại những năm 1950 với rất nhiều gương mặt quen thuộc.
Có thích thú khi sử dụng Thẻ Apple mới của bạn không? Trước khi bạn bắt đầu chi tiêu, có một nhiệm vụ bổ sung cần xem xét: chọn không tham gia trọng tài ràng buộc. Bạn sẽ phát hiện ra các điều khoản trọng tài ràng buộc trong nhiều thỏa thuận tài chính vì nó giúp ngăn các ngân hàng và đối tác kinh doanh của họ không phải ra tòa.
Điểm số tại vòng chung kết Fortnite World Cup Solo hôm nay là rất lớn, với người chiến thắng Bugha ghi được nhiều hơn 26 điểm so với người về thứ hai là Psalm. Nhưng không phải ai cũng có thể giành chiến thắng: Bốn cầu thủ ra về với 0 điểm, nhưng — ít nhất là trên Twitter — họ là những người thể thao tốt về điều đó.
Huấn luyện viên trưởng của bộ môn thể dục dụng cụ UCLA Valorie Kondos-Field theo dõi Katelyn Ohashi thi đấu thăng bằng trong trận gặp Stanford tại Pauley Pavilion vào ngày 10 tháng 3 năm 2019 ở Los Angeles, California. Vụ bê bối gian lận tuyển sinh đại học tiết lộ các chi tiết của một quá trình chính thức hóa để đưa những đứa trẻ thất bại của các gia đình giàu có và nổi tiếng vào các trường đại học đáng tin cậy và danh tiếng, sử dụng một "cửa phụ" đắt tiền cho các bậc cha mẹ mà sự giàu có của họ khiến họ không có cơ hội. chỉ cần tài trợ cho một cánh mới trong khuôn viên trường.
Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!
Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!
Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không
Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"
Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.
Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.
Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.
Bài đăng này khám phá tầm nhìn về đám mây phi tập trung của nhóm DFINITY và cách nó liên quan đến các nhà cung cấp blockchain truyền thống và đám mây hiện có như Amazon Web Services. Các minh chứng về công nghệ DFINITY được áp dụng bởi một mạng lưới quy mô lớn sẽ được thực hiện vào mùa thu năm 2017, sau đó sẽ được gây quỹ Chính cho quỹ hỗ trợ phi lợi nhuận, với mạng “đám mây mở” dự kiến sẽ ra mắt vào đầu mùa hè năm 2018 .