[英]Promise.all is returning an array of undefined and resolves before being done
我在 function 返回undefined
数组时遇到问题。
这是代码:
classMethods.getQueries = function(models, dbId, dateStart, dateEnd) {
return new Promise(function(resolve, reject) {
// Fetch database.
.then(extractQueries, reject)
.then(sortQueries, reject)
.then(onlyTen, reject)
.then(addText, reject)
.then(function(queries) {
console.log("getQueries finished", queries); // Array of 10× undefined!
resolve(queries);
}, reject);
// Functions here.
});
};
一切都很好,直到addText
function:
function addText(queries) {
return Promise.all(queries.map(function(query) {
models.queries.findById(query.queryId, {
raw: true,
attributes: [ "query" ]
})
.then(function(queryFetched) {
query.text = queryFetched.query;
console.log(query);
return Promise.resolve(query);
}, function(error) {
return Promise.reject(error);
});
}));
};
这给了我一个 output,例如:
"getQueries finished" [ undefined ×10 ]
10×
[query database]
{ queryId: "…", text: "…" }
我不知道为什么在循环未完成时返回 promise。
这是因为你没有在地图的回调中返回任何承诺:
function addText(queries) {
return Promise.all(queries.map(function(query) {
// add return here or the map returns an array of undefined
return models.queries
.findById(query.queryId, {
raw: true,
attributes: ['query']
})
.then(function(queryFetched) {
query.text = queryFetched.query;
console.log(query);
return Promise.resolve(query);
}, function(error) {
return Promise.reject(error);
});
}));
};
所以这里解决了我的问题:
function addText(queries) {
return Promise.all(queries.map(function(query) {
return new Promise(function(resolve, reject) {
models.queries.findById(query.queryId, { raw: true, attributes: ['query'] })
.then(function(queryFetched) {
query.text = queryFetched.query;
resolve(query);
}, reject);
});
}));
};
我遇到了同样的问题,我的Promise.all(list)
导致未定义的数组,我使用相同的方法将return
添加到我的 function。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.