首先,我想问一下这是否可行,是否将值设置为异步函数或promise中的全局变量?
如果是,那么为什么每个可用的教程/网站都在教程中使用console.log(results),却从不使用它来将其分配给变量。
例如:
var promise1 = new Promise(function(resolve, reject) {
resolve('foo');
});
let myval="";
promise1.then(function(value) {
myval=value;
console.log(value); // this logs "foo"
});
console.log(myval); //this logs blank
答案 0 :(得分:1)
这会将全局变量myval
更改为'foo'
,但是到console.log(myval);
被调用时,由于超时,即使已立即解决了承诺,承诺也尚未得到解决。它仍然只会在console.log(myval);
运行后更改它,因为诺言将作为microtask排队。
我将添加一个setTimeout以等待分配,或者添加一个setInterval来检查何时发生。
var promise1 = new Promise(function(resolve, reject) {
resolve('foo');});
let myval="";
promise1.then(function(value) {
myval=value;
console.log(value); // this logs "foo"
});
setTimeout(() => console.log(myval), 1000); //this logs 'foo'
答案 1 :(得分:1)
如果您要访问myval
的更改版本(即在Promise中完成分配后执行代码),则需要跟进另一个then
,或执行其他将您的代码分配到事件之后的事件队列中的事情。
var promise1 = new Promise(function(resolve, reject) {
resolve('foo');
});
let myval="a";
promise1.then(function(value) {
myval=value;
console.log(value); // this logs "foo"
});
setTimeout(() => console.log(myval), 0); // logs "foo"
var promise1 = new Promise(function(resolve, reject) {
resolve('foo');
});
let myval="a";
promise1.then(function(value) {
myval=value;
console.log(value); // this logs "foo"
}).then(function() {
console.log(myval) // logs "foo"
});
还有一个等待示例,可能是您正在寻找的示例:
await
.then
承诺保存到变量中await
在您的console.log
之前承诺(async () => {
var promise1 = new Promise(function(resolve, reject) {
resolve('foo');
});
let myval="";
var thenedPromise = promise1.then(function(value) {
myval=value;
console.log(value); // this logs "foo"
});
await thenedPromise; // wait before the promise generated by "then" is resolved
console.log(myval); // logs "foo"
})();
答案 2 :(得分:1)
这与javascript的异步行为有关。请参见下面的代码片段,并注意执行顺序。解决承诺后,value
已分配给myval
。在您的情况下,您只需要维护一个标志,即可确定该特定的承诺是否得到解决,然后在尝试获取myval
变量的值之后,将获得所需的输出。是的,它是实现这一目标的众多方法之一。
let myval="";
var promise1 = new Promise(function(resolve, reject) {
resolve('foo');
});
promise1.then(function(value) {
myval=value;
console.log("Value :" + value);
console.log("myval after promise : " + myval);
});
console.log("myval before promise : " + myval);