Javascript 这个承诺会发生什么
我创建了一个函数,它返回promise,当解析在2秒后覆盖时,它将在2秒后解析a=promise p的值Javascript 这个承诺会发生什么,javascript,promise,Javascript,Promise,我创建了一个函数,它返回promise,当解析在2秒后覆盖时,它将在2秒后解析a=promise p的值 var a = 0; var p = new Promise((resolve,reject) => { setTimeout(() => { resolve(3); }, 2000); }) function promise () { return new Promise((resolve,reject) => {
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().then( () => {
console.log(a);
}).catch(err => {
console.log('Error: ' + err);
})
我不太确定你的问题是什么,但我认为有一大堆奇怪的事情正在发生 首先,这个片段:
var p = new Promise((resolve,reject) => {
setTimeout(() => {
resolve(3);
}, 2000);
});
我认为您的意图是创建一些功能,这些功能只是创建一个承诺,并在2秒钟后解决。问题是,你只创造了一个承诺。在您调用该代码段后,时钟立即开始运行,并且该承诺的任何未来使用都将立即解决。相反,我认为您希望创建一个函数,每次都创建此承诺的新版本:
const wait2s = () => {
return new Promise(res => {
setTimeout(res, 2000);
});
};
接下来,您要创建一个函数,在2秒后更改变量的内容。这是我的版本:
const myDelayedOperation = () => {
return wait2s.then(() => {
a = 3;
});
};
希望这对您有所帮助当您调用
setTimeout
时,承诺不会等待它,而是会立即解决。要等待setTimeout
完成,请创建一个承诺,并在计时器完成时解决:
function promise () {
return p.then((val) => {
return new Promise((resolve,reject) => {
setTimeout(() => {
a = val;
resolve();
}, 2000);
});
});
}
但你真的应该
1) 不使用全局变量,尤其是异步变量
2) 不要将每个setTimeout手动包装在承诺中,而是编写一次帮助程序:
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
然后,您的代码可以编写为:
delay(2000)
.then(() => 2)
.then(a => delay(2000).then(() => a))
.then(console.log);
你运行它并发现了吗?很奇怪,你在使用承诺,但使用了一个全局变量。我运行了它。我使用全局变量来知道承诺p是否已解决。如果已解决,a不应该是3;您的变量不会在承诺解决时更改,而是在2秒后更改。因此,不要期望该变量能够很好地指示承诺的解析时间。该承诺不应该在resolve()块中的所有代码运行后(即2秒后)才解析吗?我正在尝试通过该代码找出承诺的工作方式。承诺解析后a=3不应该吗?我觉得这属于第二个代码段,不是第一次。