我有这段代码。
function a() {
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
setTimeout(resolve, 2000, 'foo');
});
Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log("done", values);
});
}
async function b() {
await a();
}
b();
console.log("here")在这里,我们得到输出
“这里”
两秒钟后,我们得到
“完成”数组3,42,"foo“
如何更改这段代码,以便在函数b()中,我们实际上是在等待a()完成,然后继续执行代码?
因此,我想要的输出是
等两秒钟看
“完成”数组3,42,"foo“
“这里”
发布于 2019-10-10 11:29:01
您可以这样编写上面的代码:
function a() {
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function (resolve, reject) {
setTimeout(resolve, 2000, 'foo');
});
// Promise.all([promise1, promise2, promise3]).then(function (values) {
// console.log("done", values);
// });
return Promise.all([promise1, promise2, promise3]);
}
async function b() {
let values = await a();
console.log('done', values);
// return values; // This will get automatically get wrapped into a promise.
return Promise.resolve(values);
}
b().then(() => { console.log("here") });在这里,a返回一个承诺,在此之后,b还返回一个立即解决的承诺。
发布于 2019-10-10 11:30:33
你可以用一种以上的方式来做。
表格1
首先,正如@chris培根所述,由于a没有返回,所以您可以返回它,而不是处理承诺本身。
而不是
Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log("done", values);
});使用
return Promise.all([promise1, promise2, promise3]);表格2
另一种方法是使a函数成为一个async function,然后等待Promise.all,这样:
async function a() {
...
await Promise.all([promise1, promise2, promise3]);
}在第二种形式中,与第一种形式不同的是,您仍然可以在它返回后处理承诺:
async function a() {
...
var values = await Promise.all([promise1, promise2, promise3]);
console.log("done", values);
}结论
这两个表单都响应您的请求,以更改您的代码段,它将几乎等同于您的代码。但是请注意,如果您使用的是catch函数,则必须在await周围使用一个try-catch。
发布于 2019-10-10 11:31:05
b是异步函数。因此,您可以在调用它时将等待放在前面,然后执行rest或执行类似的.then
b().then(res => {
//rest codes
console.log("here")
})顺便说一句,这并不需要在promise2面前放置等待,因为这甚至不是一个承诺对象。
https://stackoverflow.com/questions/58321708
复制相似问题