我创建了一个返回promise的函数,该函数在2秒钟后解决-覆盖a = 2秒钟后解决的promise p值
var a = 0;
var p = new Promise((resolve,reject) => {
setTimeout(() => {
resolve(3);
}, 2000);
})
function promise () {
return new Promise((resolve,reject) => {
resolve(
p.then(val => {
setTimeout(() => {
a = val;
}, 2000);
})
)
})
}
以下代码输出上述函数返回的promise后的值
promise().then( () => {
console.log(a);
}).catch(err => {
console.log('Error: ' + err);
})
答案 0 :(得分:1)
当您致电setTimeout
时,promise不会等待它,而是会立即解决。要等待setTimeout
完成,请在计时器结束时创建一个Promise并解决该问题:
function promise () {
return p.then((val) => {
return new Promise((resolve,reject) => {
setTimeout(() => {
a = val;
resolve();
}, 2000);
});
});
}
但是你应该认真
1)不要使用全局变量,尤其是对于异步内容
2)不将每个setTimeout手动包装在Promise中,而是编写一次助手:
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
然后您的代码可以写为:
delay(2000)
.then(() => 2)
.then(a => delay(2000).then(() => a))
.then(console.log);
答案 1 :(得分:0)
我不太确定您的问题是什么,但是我认为有很多奇怪的事情在发生。
第一个代码段
var p = new Promise((resolve,reject) => {
setTimeout(() => {
resolve(3);
}, 2000);
});
我认为您的目的是创建一些功能,该功能只是创建一个承诺,该承诺会在2秒后解决。问题是,您只能创建1个诺言。调用该代码段后,时钟立即开始运行,并且以后对这个相同诺言的任何使用都会立即解决。相反,我认为您想创建一个函数,每次都创建此承诺的新版本:
const wait2s = () => {
return new Promise(res => {
setTimeout(res, 2000);
});
};
接下来,您要创建一个在2秒钟后更改变量内容的函数。这是我的版本:
const myDelayedOperation = () => {
return wait2s.then(() => {
a = 3;
});
};
希望这会有所帮助