如何解决循环将API请求与Node.js中的Axios链接-不能按顺序工作
编辑: 尝试了以下建议以及更多内容,现在这是代码,我几乎已经使所有内容异步等待,而不是然后捕获...
makeNextAccount();
console.log("Making :" + merchantsToCreate.length + " Accounts")
async function makeNextAccount(currentIndex) {
for (const item of merchantsToCreate) {
try{
let accId = "";
var createAccBody = JSON.stringify(
{
"email":emails[item],"firstName":"sdd","lastName":"dgdg"
});
var createAcc = {
method: 'post',url: url1,headers: awsHeaders,data : createAccBody
};
const createdAccResult = await axios(createAcc); // wait for the request to finish
await Promise.all(createdAccResult);
console.log('Done!');
accId = createdAccResult.data.accountId;
console.log(JSON.stringify("ACCOUNT CREATED:" + accId));
} catch(err) {
console.log("ERROR Create acc:" + err );
}
try{
var initUnAuthBody = JSON.stringify(
{
"accountId": accId
});
var initUnAuth = {
method: 'post',url: url2,data : initUnAuthBody
};
const initUnAuthResult = await axios(initUnAuth); // wait for the request to finish
console.log(JSON.stringify("Init unAuth for:" +accId+",with response:" + initUnAuthResult.status));
}catch(err) {
console.log("ERROR unautinit:" + err);
}
try{
var provisionBody = JSON.stringify(
{
"name": accId,"active": "1"
});
var provision = {
method: 'post',url: url3,data : provisionBody
};
const provisionResult = await axios(provision); // wait for the request to finish
console.log(JSON.stringify("Provision for:" + accId+",with response:" + provisionResult.status));
}catch(err) {
console.log("ERROR provision:" + err);
}
try{
var salesForceRecordody = JSON.stringify(
{
"email": emails[item],"accountId": accId,});
var salesForceRecord = {
method: 'post',url: url4,data : salesForceRecordody
};
const salesForceRecordResult = await axios(salesForceRecord); // wait for the request to finish
console.log(JSON.stringify("SalesForce Record for:" +accId+",with response:" + salesForceRecordResult.status));
accCreatedList.push(accId); // Push to created list only when all steps are done
}catch(err) {
console.log("ERROR Salesforce:" + err);
}
}
}
其结果是,如您所见,返回400错误,但我不知道如何在axios中使用异步等待时如何从服务器获得完整响应,它在使用then和抓住,但我只能得到这个简单的答复。
在控制台中打印正文/标题时,一切似乎都很好,这与我之前所做的请求相同,但是由于某种原因在这里失败...
Making :3 Accounts
ERROR Create acc:Error: Request failed with status code 400
ERROR unautinit:Error: Request failed with status code 400
ERROR provision:Error: Request failed with status code 400
ERROR Salesforce:Error: Request failed with status code 400
ERROR Create acc:Error: Request failed with status code 400
ERROR unautinit:Error: Request failed with status code 400
ERROR provision:Error: Request failed with status code 400
ERROR Salesforce:Error: Request failed with status code 400
ERROR Create acc:Error: Request failed with status code 400
ERROR unautinit:Error: Request failed with status code 400
ERROR provision:Error: Request failed with status code 400
ERROR Salesforce:Error: Request failed with status code 400
解决方法
使用async / await相对简单:
for(...) {
const result = await axios(...); // wait for the request to finish
// do something with your result
}
,
基本上,您需要让函数返回axios正在创建的Promise。很难说出样本的间距,但是看起来像在该行中添加return
即可:
return axios(createAcc)
然后,您无需进行setTimeout
并循环,而是需要进行第一个调用,等待其结束,然后在then()
方法中,如果有一个调用,则进行下一个调用:
var merchantsToCreate = getFromSomewhere();
var currentIndex = 0;
function makeNextAccount() {
if (currentIndex < merchantsToCreate.length - 1) {
currentIndex++;
accountCreationFlow(merchantsToCreate[i],emails[i])
.then(makeNextAccount); // <- will make the next account
}
}
makeNextAccount(); // kick off the "loop"
,
我唯一可以用来解决此问题的解决方案是:
- 使用位于异步函数中的For..in循环
- 使用这种请求方式:const ProvisionResult =等待axios(provision)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。