【发布时间】:2020-03-31 10:06:54
【问题描述】:
我有一个 main 函数,它像这样等待并并行连接几个函数:
主要功能:
console.log('A');
const pivotData = await Promise.all(
Object.entries(thenWidgets.val()).map(widget => {
getPivot(widget, userId)
console.log('B');
});
);
console.log('C');
console.log('D');
const mainData = await Promise.all(
pivotData.map(widget => getMain(widget))
);
console.log('F');
mainData.map(item => {
return (finalObject[item.widgetId] = item);
});
console.log('G');
工作正常,直到它到达console.log('D') 下面的 mainData。它似乎没有等待承诺并直接跳到console.log('F'),而不等待拥有console.log('E')的getMain函数
getMain() 函数:
const getMain = widget => {
return new Promise(resolve => {
var requests = [];
const pivotData = {};
Object.keys(widget.pivot).map(item => {
const mainRef = firebase
.database()
.ref()
.child(widget['default'].type)
.child(item);
mainRef.once('value', snapMain => {
pivotData[item] = snapMain.val();
}).then(() => {
widget['main'] = pivotData;
console.log('E');
requests.push('test');
});
console.log('E2')
})
Promise.all(requests)
.then(() => {
console.log('E3');
resolve(widget);
})
.catch(error => console.log(`Error in promises ${error}`));
});
};
这里的预期结果是:'E,E2,E,E2,E3',但我得到的是'E2,E2,E3',然后它返回承诺。后来,在所有承诺都解决后的某个地方,我得到了“E,E”。所以整个事情的预期结果应该是'A,B,C,D,E,E2,E,E2,E3,F,G'我现在拥有的是'A,B,C,D,E2,E2 , E3, F, G, E, E'
似乎getMain() 中的Object.keys 中的promise 并没有等待mainRef.once。也许我错过了一些东西。
我的问题是:promise 不等待getMain() 函数出了什么问题?
【问题讨论】:
-
请更新您的代码,因为存在语法错误并且很难判断出什么问题
-
语法错误在哪里?
-
main函数的第三行,没有大括号,我不知道你是想添加大括号还是在仍然包含console.log时以某种方式返回getPivot,你的地图回调将返回@987654330 @
-
@KrzysztofKrzeszewski 我加了大括号
-
好吧,看来你已经添加了大括号,但是
map回调没有返回值(返回未定义),所以它会立即解决,在你的 promise.all 语句中没有值,对现在,无论您的 pivotData 是什么,都将是一个空数组(或者更确切地说是长度为Object.entries(thenWidgets.val()).length的数组,其中充满了未定义)
标签: javascript firebase asynchronous promise