Javascript 这个承诺会发生什么

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) => {

我创建了一个函数,它返回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) => {
        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不应该吗?我觉得这属于第二个代码段,不是第一次。