driver.sleep
은 약속이므로 i
이 길이가 a
이상으로 증가한 후에 실행됩니다. 약속이 실행될 때까지 i
은 4
이며 이는 a
의 유효한 색인이 아닙니다.
1 : 당신은 두 가지 (뿐만 아니라 드라이버 모의 추가) 중 하나를 수행하여이 문제를 얻을 수 있습니다
var driver = {
sleep: function(time) {
return new Promise(function(resolve, reject) {
setTimeout(resolve, time);
});
}
}
driver.sleep(2000).then(function logAInConsole() {
var a = ["Quas","Wex","Exort","Invoke"];
for(var i = 0; i < a.length; i++) {
driver.sleep(1000).then(function loggingA(i) {
driver.sleep(1000).then(function() {
console.log(a[i]);
})
}.bind(this, i));
}
});
다음
for
루프의 안쪽 바깥 쪽 함수에
i
바인딩
2 : forEach
:
var driver = {
sleep: function(time) {
return new Promise(function(resolve, reject) {
setTimeout(resolve, time);
});
}
}
driver.sleep(2000).then(function logAInConsole() {
var a = ["Quas","Wex","Exort","Invoke"];
a.forEach(function(value) {
driver.sleep(1000).then(function loggingA(i) {
driver.sleep(1000).then(function() {
console.log(value);
})
});
});
});
당신이
a
아무것도 변경할 필요가 없습니다 경우 일반적으로 더 명확 성능의 작은 약간의 비용으로 for 루프보다 더이기 때문에 일반적으로
은, 그것은, forEach
를 사용하는 것이 더 의미가 있습니다. 어떠한 이유로 든 a
과 i
이 절대적으로 필요하거나 루핑이 게으르려면, 약속 함수에서 사용할 수있는 유일한 방법은 가장 바깥 쪽 함수에 바인딩하여 값을 유지하는 것입니다.