无法访问JS中函数范围之外的变量

时间:2014-07-31 13:11:02

标签: javascript scope

很抱歉这个noobie问题,但我一直在搜索关于阴影变量的所有现有答案,但仍无法使我的代码正常工作

export default Ember.ArrayController.extend({
    actions: {
        generateInvoice: function() {
             var amount1; // declare a variable
             var amount2;
            this.store.find('product', 1).then(function(obj){
                amount1 = 100; //assign value to the amount variable
            });
            this.store.find('product', 2).then(function(obj){
                amount2 = 200; 
            });
            console.log(amount1); // undefined!
            console.log(amount2); // undefined!

            $.post('http://nzud.co.nz/invoice',{
                    foo1: amount1, //access variable amount ---doesn't work!!
                    foo2: amount2

                    } ).done(function(data){
                        alert("success!");
            })
        }
    }
});

我已经尝试了很多方法,但仍然无法将模型记录属性存储到变量中并从$.post有效负载

进行访问

2 个答案:

答案 0 :(得分:2)

要继续使用变量new值,您必须将代码放在promisse then中。然后它会工作:

export default Ember.ArrayController.extend({
    actions: {
        generateInvoice: function() {
            this.store.find('product', 1).then(function(obj){
                var amount = 100; //assign value to the amount variable

                $.post('http://nzud.co.nz/invoice',{
                    foo: amount
                }).done(function(data){
                    alert("success!");
                })
            });
        }
    }
});

这是因为方法find是异步的,所以你必须在回调函数中处理它的结果,在这种情况下是函数thengenerateInvoice范围内的所有内容(可能)都会在find方法请求结束之前被调用,即使它是第一个在其中调用的方法。

<强>更新

我对find的两个product, 1方法没有明白你的意思,但是:

  • 如果请求中有两个值要发送到帖子,则只应使用find()方法一次:

    this.store.find('product', 1).then(function(obj){
        var amount = 100; //assign value to the amount variable
    
        $.post('http://nzud.co.nz/invoice',{
            foo: amount,
            bar: another_value
        })
    });
    
  • 或者,如果您必须调用两个不同的find方法,则必须将它们链接起来:

    this.store.find('product', 1).then(function(obj){
        var amount = 100; //assign value to the amount variable
    
        this.store.find('product', 1).then(function(obj){
            var another_amount = 100; //assign value to the amount variable
    
            $.post('http://nzud.co.nz/invoice',{
                foo: amount,
                bar: another_amount
            })
        });
    });
    

答案 1 :(得分:-1)

在你的函数之外声明数量:

var amount; // declare a variable
export default Ember.ArrayController.extend({
    actions: {
        generateInvoice: function() {
            this.store.find('product', 1).then(function(obj){
                amount = 100; //assign value to the amount variable
            });
            console.log(amount) // undefined!

            $.post('http://nzud.co.nz/invoice',{
                    foo: amount, //access variable amount ---doesn't work!!

                    } ).done(function(data){
                        alert("success!");
            })
        }
    }
});