"do some stuff -6ren">
gpt4 book ai didi

javascript - 如何在 Promise 中使用 requestAnimationFrame

转载 作者:行者123 更新时间:2023-12-05 03:46:56 25 4
gpt4 key购买 nike

我想将requestAnimationFrame与Promise一起使用,所以我可以这样使用它

opacityToggle("layername",0).then(i=>"do some stuff after animation ends")

,但不确定如何执行此操作。这是我的代码:

function opacityToggle(layerName, opacity) {

if (!layerName) return;
var requestID;
var s = 0;

return animate().then(i => i)

function animate() {
requestID = requestAnimationFrame(animate);
if (s < 1) {
s += 0.01
s = +s.toFixed(2)
console.log('s', layerName, s, opacity);
map.setPaintProperty(layerName, 'fill-opacity', s);
} else {
cancelAnimationFrame(requestID);
return new Promise(resolve => resolve)
}
}
}

最佳答案

虽然@Terry 有一个简单的解决方案,可以将所有内容都包装在 promise 构造函数中,但如果您仅对 requestAnimationFrame 调用自身进行 promisify,您将获得 promises 的真正力量:

async function opacityToggle(layerName, opacity) { /*
^^^^^ */
if (!layerName) return;

var s = 0;
while (s < 1) {
// ^^^^^
s += 0.01
s = +s.toFixed(2)
console.log('s', layerName, s, opacity);
map.setPaintProperty(layerName, 'fill-opacity', s);

await new Promise(resolve => {
// ^^^^^
requestAnimationFrame(resolve);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
});
}
}

如果你不能使用 async/await 和/或想用递归方法来做,那就是

function opacityToggle(layerName, opacity) {
if (!layerName) return Promise.resolve();

var s = 0;
return animate();

function animate() {
if (s < 1) {
s += 0.01
s = +s.toFixed(2)
console.log('s', layerName, s, opacity);
map.setPaintProperty(layerName, 'fill-opacity', s);
return new Promise(resolve => {
// ^^^^^^
requestAnimationFrame(resolve);
}).then(animate);
// ^^^^^^^^^^^^^^
} else {
return Promise.resolve();
}
}
}

关于javascript - 如何在 Promise 中使用 requestAnimationFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65144038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com