我想更改我在库中调用的变量的值,但似乎是由于某些范围问题,我无法做到。我的代码如下所示:
var data = "";
abc.abc(lat, long).then(function(x) {
data = x;
console.log(data);
});
console.log(data);
第一个输出显示x的值,但第二个输出仍为空。我做错了什么?
注意:abc是一个使用promises的外部库。
答案 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();
});
});