繁体   English   中英

在循环中将 API 请求与 Node.js 中的 Axios 链接在一起 - 无法按顺序工作

[英]Chaining API requests with Axios in Node.js in a loop - doesn't work in order

已编辑:尝试了以下建议以及更多内容,现在这是代码,我几乎只是将其全部设为异步等待而不是然后捕获...

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,
      headers: awsHeaders,
      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,
      headers: awsHeaders,
      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,
      headers: awsHeaders,
      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 和 catch 时很容易显示,但我只能得到这个简单的回应。

在控制台中打印正文/标题时,一切似乎都很好,这与我之前所做的请求相同,但由于某种原因在这里失败了......

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
}

基本上,您需要让您的 function 返回 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"

我能够用来解决这个问题的唯一解决方案是:

  1. 使用放置在异步 function 中的 For..in 循环
  2. 使用这种请求方式: const provisionResult = await axios(provision)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM