Promises 和 setTimeout 不能一起工作
Promises and setTimeout is not working together
我一直在为此苦苦挣扎。我有一个推荐滑块。没什么特别的,但我想向元素添加一个过渡 class 2 秒,然后将其删除。
此外,我正在使用此类项目来更加努力地推动自己。所以我正在尝试使用 Promises 来做到这一点,推荐来自 Fetch 调用。
出于某种原因,setTimeout
根本无法正常工作。调试器表示无需进入计时器即可解决。
arrows.forEach((item) => {
item.addEventListener('click',() => {
return new Promise ((resolve,reject) => {
container.classList.add('transition');
setTimeout(() => {
if (item.getAttribute('data-direction') == 'right'){
if(counter < array.length -1) {
counter ++;
} else {
counter = 0;
}
} else {
if(counter > 0) {
counter --;
} else {
counter = array.length -1;
}
}
}, 5000)
}).then(resolve =>{
testi(array,counter);
container.classList.remove('transition');
})
});
})
您需要在 setTimeout()
中调用 resolve()
。
arrows.forEach((item) => {
item.addEventListener('click',() => {
// no point in returning to an event listener
new Promise ((resolve,reject) => {
container.classList.add('transition');
setTimeout(() => {
/// do synchronous stuff
// then reolve promise
resolve()// include any value you want passed to next `then()`
}, 5000)
}).then(resolve =>{
testi(array,counter);
container.classList.remove('transition');
})
});
})
在您的代码中:
return new Promise ((resolve,reject) => {
container.classList.add('transition');
setTimeout(() => {
if (item.getAttribute('data-direction') == 'right'){
if(counter < array.length -1) {
counter ++;
} else {
counter = 0;
}
} else {
if(counter > 0) {
counter --;
} else {
counter = array.length -1;
}
}
}, 5000)
})
您没有解决或拒绝承诺。因此,promise 始终处于挂起状态,并且您的 then()
(或 catch()
发生错误时)方法回调将永远不会执行。
这是一个例子:
let prom = new Promise ((resolve,reject) => {
setTimeout(() => {
resolve('succes!')
}, 5000)
});
prom.then((res) => {console.log(res); });
我一直在为此苦苦挣扎。我有一个推荐滑块。没什么特别的,但我想向元素添加一个过渡 class 2 秒,然后将其删除。
此外,我正在使用此类项目来更加努力地推动自己。所以我正在尝试使用 Promises 来做到这一点,推荐来自 Fetch 调用。
出于某种原因,setTimeout
根本无法正常工作。调试器表示无需进入计时器即可解决。
arrows.forEach((item) => {
item.addEventListener('click',() => {
return new Promise ((resolve,reject) => {
container.classList.add('transition');
setTimeout(() => {
if (item.getAttribute('data-direction') == 'right'){
if(counter < array.length -1) {
counter ++;
} else {
counter = 0;
}
} else {
if(counter > 0) {
counter --;
} else {
counter = array.length -1;
}
}
}, 5000)
}).then(resolve =>{
testi(array,counter);
container.classList.remove('transition');
})
});
})
您需要在 setTimeout()
中调用 resolve()
。
arrows.forEach((item) => {
item.addEventListener('click',() => {
// no point in returning to an event listener
new Promise ((resolve,reject) => {
container.classList.add('transition');
setTimeout(() => {
/// do synchronous stuff
// then reolve promise
resolve()// include any value you want passed to next `then()`
}, 5000)
}).then(resolve =>{
testi(array,counter);
container.classList.remove('transition');
})
});
})
在您的代码中:
return new Promise ((resolve,reject) => {
container.classList.add('transition');
setTimeout(() => {
if (item.getAttribute('data-direction') == 'right'){
if(counter < array.length -1) {
counter ++;
} else {
counter = 0;
}
} else {
if(counter > 0) {
counter --;
} else {
counter = array.length -1;
}
}
}, 5000)
})
您没有解决或拒绝承诺。因此,promise 始终处于挂起状态,并且您的 then()
(或 catch()
发生错误时)方法回调将永远不会执行。
这是一个例子:
let prom = new Promise ((resolve,reject) => {
setTimeout(() => {
resolve('succes!')
}, 5000)
});
prom.then((res) => {console.log(res); });