关于Promise用法的疑问

在做微信小程序,假如在生命周期onLoad中,有两个异步函数需要执行后拿到结果,传递给一个同步的方法。
本来是想前面两个异步方法用Promise.all后,然后传递给下面这个同步的函数。
结果却是这个同步方法不等前面两个异步,就先执行了报错了(没等到值)。

就比如这样:

let a = new Promise(function(res){res(1);})
let b = new Promise(function(res){res(2);})
Promise.all([a,b]).then(res=>console.log(res))
console.log(b)


怎么才能让console.log打印出b?

后来使用的ansyc和await,把前面两个异步变成同步后解决了。

假如硬是要用promise来搞,怎么办?

另外感觉ansyc比promise更容易让新手理解

阅读 1.7k
4 个回答

使用 await 的方法

(async () => {
    let a = new Promise(function (res) { res(1); });
    let b = new Promise(function (res) { res(2); });
    const [, rb] = await Promise.all([a, b]);
    console.log(rb);
})();

不使用 await 的方法

(() => {
    let a = new Promise(function (res) { res(1); });
    let b = new Promise(function (res) { res(2); });
    Promise.all([a, b]).then(([, b]) => {
        console.log(b);
    });
})();

两个方法就是用 await 还是用 then 的区别,参阅理解 JavaScript 的 async/await

const wait = (delay) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(delay)
            resolve()
        }, delay)
    })
}

Promise.all([wait(1000), wait(2000)]).then(res => {
    console.log('done')
})

这里可以起作用吧,是不是其他地方卡住了

image.png

而且直接打印b的那条语句也是可以打印出来值的:

image.png

分析一波:
image.png
绿色框里的是同步执行的,红色框里的是异步执行的。
大概就类似于

let a = 1;
let b = 2;
console.log(b)

// 只不过这个a、b都是Promise类型的

上面这段同步任务执行完毕,就会执行下面这段

Promise.all([a,b]).then(res=>console.log(res))

你想要在 a、b两个异步方法都结束之后执行同步方法的话,就要把同步方法包裹在Promise.all().then()里面,比如下面这样:

Promise.all([a,b]).then(()=>{ 
    同步方法...
})

(没有试验过,理论是这个理论,可以搞一下试试)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题