当从同一类的异步方法调用类内部的异步方法时,Promise(挂起)



Am正在使用sequilizer并进行挣扎,因为该方法永远处于挂起状态。

以下是我尝试做的一个简化版本。基本上,API通过调用BatchProcessor来使用以下方法,BatchProcessor本应处理提供的json。

我基本上希望BatchProcessor从FinalTheme方法获得主题和主题,但这个承诺永远悬而未决。

export default {

async FinalTheme(id) {
return db.Themes.findOne({
where: {
ID: id
},
attributes: ["ThemeCost","ThemeGate"],
limit: 1
})
.then(data => {
if (data == null) {
return -1;
}
return {
cost: data["ThemeCost"],
gate: data["ThemeGate"]
};
})
.catch(err => {
return false;
});
},

async BatchProcessor(record, index_number) {
const SQL ="SELECT * FROM themes";

return db.sequelize
.query(SQL, {
type: db.sequelize.QueryTypes.SELECT
})
.then(themes => {
// do we have data here?
const totalThemes = themes.length;

let lastAmount = record["Amount"]; 
for (
let counter = 0;
counter < totalThemes - 1;
counter++
) {

const CustomerFinalTheme = this.FinalTheme(record["CustomerID"]); // FOREVER PENDING

}

})
.catch(err => {
console.log(JSON.stringify(err));
});
},
};

我考试做错了什么?

this.FinalTheme(…返回一个承诺,而不是您必须执行的值:

this.FinalTheme(record["CustomerId"]) // where is the record assigned?
.then(data => {
const CustomerFinalTheme = data;
})

在声明函数时也不需要使用async,即以下内容可以:

FinalTheme(id) {
return db.Themes.findOne({
[...]
}

您正在BatchProcessor的块内部运行循环。你可以在里面等循环。

async BatchProcessor(record, index_number) {
const SQL ="SELECT * FROM themes";
const themes = await db.sequelize.query(SQL, { type: db.sequelize.QueryTypes.SELECT });
const totalThemes = themes.length;
let lastAmount = record["Amount"]; 
for (let counter = 0; counter < totalThemes - 1; counter++) {
const CustomerFinalTheme = await this.FinalTheme(record["CustomerID"]);
}
return 'ALL DONE';
}

最新更新