定期解决 javascript 中的承诺
Periodically resolving a promise in javascript
假设我想在函数 运行.
之后每 2 秒解决一些 promise
我一开始尝试了这样的模式:setInterval(MyAsyncFunction, 2000)
,但是当然这不会在再次调用函数之前等待承诺解决。
我也试过 setInterval(async () => await MyAsyncFunction(), 2000)
,但这基本上是一回事,因为我只是将它包装在另一个承诺中,该承诺将在 setInterval 下降时解决。
有没有办法用 setInterval 做我想做的事情,或者有其他方法可以用 setTimeout 做这个吗?
Promise 仅解析一次,因此根据定义不能定期解析。
如果您定义了一个延迟函数,returns 一个在 timeout
毫秒后解析的承诺...
const delay = timeout => new Promise(resolve => setTimeout(resolve, timeout));
您可以在异步循环中使用它:
async function foo(){
for(let i = 0; i < 100; ++i){
console.log("azrael");
await delay(2000);
}
}
如果你想调用async函数,然后等待它,然后等待额外的固定时间,然后重复,你可以通过以下方式实现。
您可以从该函数本身调用 setTimeout,因此它会在完成后安排下一个 运行:
async function myAsyncFunction() {
return new Promise(resolve => setTimeout(() => {
resolve('result'); // resolves, then
setTimeout(async () => { // schedules
let result = await myAsyncFunction(); // self-call
console.log('result') // and handles the result
}, 2000); // after extra 2s
}, 2000)); // imitates async function with 2s delay
}
async function main() {
let firstResult = await myAsyncFunction();
console.log(firstResult); // handles first call
}
更简洁的方法是将其包装在另一个内部具有相同 setTimeout 的异步函数中:
async function myAsyncFunction() {
// imitates async function
return new Promise(resolve => setTimeout(() => resolve('result'), 2000));
}
async function delayLoop() {
let result = await myAsyncFunction(); // waits for it
console.log(result);
setTimeout(delayLoop, 2000); // calls itself after extra 2s
}
delayLoop();
这样您就不必修改原始异步函数代码并将回调放在那里。
两个示例都将在第一个结果之前等待异步函数 2 秒,并在调用之间等待 4 秒 - 异步函数延迟 2 秒 + 之后额外延迟 2 秒。
假设我想在函数 运行.
之后每 2 秒解决一些 promise我一开始尝试了这样的模式:setInterval(MyAsyncFunction, 2000)
,但是当然这不会在再次调用函数之前等待承诺解决。
我也试过 setInterval(async () => await MyAsyncFunction(), 2000)
,但这基本上是一回事,因为我只是将它包装在另一个承诺中,该承诺将在 setInterval 下降时解决。
有没有办法用 setInterval 做我想做的事情,或者有其他方法可以用 setTimeout 做这个吗?
Promise 仅解析一次,因此根据定义不能定期解析。
如果您定义了一个延迟函数,returns 一个在 timeout
毫秒后解析的承诺...
const delay = timeout => new Promise(resolve => setTimeout(resolve, timeout));
您可以在异步循环中使用它:
async function foo(){
for(let i = 0; i < 100; ++i){
console.log("azrael");
await delay(2000);
}
}
如果你想调用async函数,然后等待它,然后等待额外的固定时间,然后重复,你可以通过以下方式实现。
您可以从该函数本身调用 setTimeout,因此它会在完成后安排下一个 运行:
async function myAsyncFunction() {
return new Promise(resolve => setTimeout(() => {
resolve('result'); // resolves, then
setTimeout(async () => { // schedules
let result = await myAsyncFunction(); // self-call
console.log('result') // and handles the result
}, 2000); // after extra 2s
}, 2000)); // imitates async function with 2s delay
}
async function main() {
let firstResult = await myAsyncFunction();
console.log(firstResult); // handles first call
}
更简洁的方法是将其包装在另一个内部具有相同 setTimeout 的异步函数中:
async function myAsyncFunction() {
// imitates async function
return new Promise(resolve => setTimeout(() => resolve('result'), 2000));
}
async function delayLoop() {
let result = await myAsyncFunction(); // waits for it
console.log(result);
setTimeout(delayLoop, 2000); // calls itself after extra 2s
}
delayLoop();
这样您就不必修改原始异步函数代码并将回调放在那里。
两个示例都将在第一个结果之前等待异步函数 2 秒,并在调用之间等待 4 秒 - 异步函数延迟 2 秒 + 之后额外延迟 2 秒。