我试图将a的值记录到控制台。
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() {
driver.sleep(1000).then(function() {
console.log(a[i]);
})
});
}
});
给定代码的结果是:
未定义
未定义
未定义
未定义
答案 0 :(得分:0)
你不应该在循环中创建函数 - 改为使用“forEach”:(创建“驱动程序”对象来模拟真实的承诺行为)
var driver = {}
driver.sleep = function() {
return new Promise((resolve)=>{
resolve()
})
}
driver.sleep(2000).then(function(){
var a = ["Quas","Wex","Exort","Invoke"];
a.forEach((b)=>{
driver.sleep(1000).then(function loggingA(){
driver.sleep(1000).then(function(){
console.log(b);})
});
})
});
答案 1 :(得分:0)
它可以访问该功能。这是它在访问a[i]
时生成“未定义”而不是错误的原因。
代码的错误是,当访问变量i
时,它已经递增4
。结果,[4]未定义。
答案 2 :(得分:0)
问题是,因为https://
是一个承诺,它会在driver.sleep
增加超过i
的长度后运行。也就是说,到承诺运行时,a
为i
,这不是4
中的有效索引。您可以通过执行以下两项操作之一来解决此问题(也添加驱动程序模拟):
1:将a
绑定到i
循环内部的最外层函数:
for
2:使用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));
}
});
:
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
,或者如果你需要循环延迟,那么确保它们在promise函数中可用的唯一方法是将它们绑定到最外层的函数,保持他们的价值。