这个诺言将会发生什么

时间:2019-04-16 16:45:29

标签: javascript promise

我创建了一个返回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);
})

2 个答案:

答案 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;
   });
};

希望这会有所帮助