更改库调用中的外部变量值

时间:2016-04-24 02:56:54

标签: javascript scope

我想更改我在库中调用的变量的值,但似乎是由于某些范围问题,我无法做到。我的代码如下所示:

var data = "";
abc.abc(lat, long).then(function(x) {
    data = x;
    console.log(data);
});
console.log(data);

第一个输出显示x的值,但第二个输出仍为空。我做错了什么?

注意:abc是一个使用promises的外部库。

2 个答案:

答案 0 :(得分:1)

在分配之前,您无法引用data的值。即使内部function(x)在第二个console.log之前宣布,但 之后

查看 time 的简化说明,每个语句都在代码旁边标记,从time = 0开始

var data = ""; // time = 0
abc.abc(lat, long).then(function(x) {
    data = x; // time = N > 2 (i.e. at this time, the promise has been resolved)
    console.log(data);
}); // time = 1
console.log(data); // time = 2

最重要的是,如果您可以通过这种方式同步引用data,那么就不要使用承诺。但是,不建议不使用promises进行潜在的长时间运行操作。

您应该采用您的代码,以便只有在解决了承诺后才能访问data

这样做的最佳做法可能因您使用的Javascript框架(如果有)而有所不同

答案 1 :(得分:1)

这一切都与异步编程有关,请记住,承诺是在某个进程完成后执行的,所以它不会阻止IO给用户,你可以使用加载告诉用户进程正在执行。

it('returns http 200', function (done) {
        chai
        .request(baseUrl)
        .get('/api/')
        .set('Authorization', 'Basic abc')
        .query({val:'hey'})
        .end(function(err, res) {
            expect(res).to.have.status(200);

            var json = res.text;

            var body = JSON.parse(json.body);
            var obj = JSON.stringify(body);
            var jsonObj = JSON.parse(obj);
            var val = jsonObj.body.value.total;
            expect(val.to.be.above(0));
            done();
        });
    });