问题描述
我正在尝试在每个循环中进行 api 调用。 当我进行 api 调用时,该函数返回 Promise。 我想使用该返回响应并检查承诺是否已解决(然后做某事)以及是否被拒绝(然后做某事)。 但是,每次在 foreach 循环中,api 首先进行两个调用,然后转到 then() 部分。 我想要的是在 foreach 循环中,进行 api 调用 -> 检查是否已解决或被拒绝 -> 做某事 -> 进行 api 调用 -> 检查是否已解决或被拒绝 -> 做某事等等。
//不能改变下面的实现。 我需要使用这个已经创建的函数
const callApiFunction = options => {
const callback = (resolve, reject) => {
something.call(options, resolve, reject)
};
return new Promise(callback);
}
//第一次尝试
const a =[];
const b =[];
list.forEach(listelement => {
callApiFunction(options)
.then(() => {
a.push(listelement);
})
.catch(() => {
b.push(listelement);
});
});
//第二次尝试
const a =[];
const b =[];
list.forEach(listelement => {
let promise = new Promise((resolve, reject) => {
callApiFunction(options);
resolve(listelement);
reject(listelement);
});
promise.then((listelement) => {
a.push(listelement);
})
.catch((listelement) => {
b.push(listelement);
});
});
在我的第二个代码块中发生的情况是,如果 list.length = 2,则 callApiFunction 首先执行两次, then
执行两次。
我希望 callApiFunction 被执行并且 list[0] -> then or catch 相应地执行 callApiFunction 被执行并且 list[1] -> then or catch 相应地执行
1楼
这个带有for-of
循环和await
变体对你await
吗?
'use strict';
async function separate(list) {
const a = [];
const b = [];
for (const listelement of list) {
try {
await callApiFunction(options);
a.push(listelement);
} catch (err) {
b.push(listelement);
}
}
return [a, b];
}
separate([1, 2, 3]).then(([good, bad]) => {
console.log(`Success:\n${good.join('\n')}\n\nErrors:\n${bad.join('\n')}\n`);
});