我的功能在if中最终确定承诺之前结束。 我们的想法是能够以同步的方式执行promises(必要的),以便在返回对象时,完成所有承诺并完成所有承诺。
let var1 = '';
let var2 = '';
let var3 = '';
if(condition1){
promise1().then(result =>{
var1 = result;
)
}
if(condition2){
promise2().then(result =>{
var2 = result;
)
}
if(condition3){
promise2().then(result =>{
var3 = result;
)
}
let object = {
var1: var1,
var2: var2,
var3: var3
}
resolve(object);
我最初做的是使用Promise.all
,但它不起作用,并且该函数返回对象而不完成承诺。这是我的实施。
let var1 = '';
let var2 = '';
let var3 = '';
let array_promises = [];
if(condition1){
promise1().then(result =>{
var1 = result;
array_promises.push(result);
)
}
if(condition2){
promise2().then(result =>{
var2 = result;
array_promises.push(result);
)
}
if(condition3){
promise2().then(result =>{
var3 = result;
array_promises.push(result);
)
}
.
.
.
Promise.all(array_promises).then(()=>{
let object = {
var1: var1,
var2: var2,
var3: var3
.
.
.
}
resolve(object);
});
它也没用。返回对象而不完成promises的执行。 我不想使用任何第三方npm或类似的东西。任何指导或建议?,我可能做错了什么
答案 0 :(得分:4)
你需要在一个 Promises数组上调用Promise.all
- 如果数组不包含实际的Promises,那么Promise.all
将不会等待任何事情,并且会尽快解决。您的array_promises
不是Promise
的数组,它只是一个可能被推送到的值数组。请尝试在承诺本身上调用Promise.all
:
const condition1 = true;
const condition2 = false;
const condition3 = true;
const promise1 = () => new Promise(resolve => setTimeout(resolve, 200, 'p1'));
const promise2 = () => new Promise(resolve => setTimeout(resolve, 200, 'p2'));
const promise3 = () => new Promise(resolve => setTimeout(resolve, 200, 'p3'));
Promise.all(([
condition1 ? promise1() : '',
condition2 ? promise2() : '',
condition3 ? promise3() : '',
])).then(([var1, var2, var3]) => {
const returnObj = {
var1,
var2,
var3,
};
console.log(returnObj);
})
这是有效的,因为在传递给Promise.all
的数组中,任何非promises的值都将按原样传递给.then
。
通过resolve(object);
,看起来,好像整个代码都在Promise
构造函数中。如果是这种情况,那么如果你改为返回 Promise.all
调用,而不是显式创建另一个新的Promise,那可能会更好。