如何访问另一个.then函数内的.then函数内的变量?

时间:2017-05-21 10:12:30

标签: javascript node.js

我试图将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]);
            })
        });
    }
});

给定代码的结果是:
未定义
未定义
未定义
未定义

3 个答案:

答案 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的长度后运行。也就是说,到承诺运行时,ai,这不是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循环更清晰,但代价是一点点表现。如果由于某种原因绝对需要forEacha,或者如果你需要循环延迟,那么确保它们在promise函数中可用的唯一方法是将它们绑定到最外层的函数,保持他们的价值。

相关问题