首页 > 解决方案 > 下一次迭代开始前的 API 调用在循环中开始

问题描述

我想通过他们的 API 向某个应用程序发送一个 POST 请求。我想要做的是处理输入数据(称为数据)并在循环中的一条记录上发送一个 POST 请求。然后,为了优化目的,我删除了数据中的相应对象。我知道由于 JavaScript 的异步特性,循环在函数被调用之前完成。但是,即使我将 api 函数包装在 IIFE 中或将其包装在带有 await 的异步函数中(代码如下),编译器仍然给我使用相同参数的函数调用,即最后一个对象。所以,当我在应用程序上看到创建的记录时,大卫的信息被生成了 3 次。下面的截图是处理后的每个记录对象。如果你能告诉我在循环的下一次迭代之前触发 api 调用的方法,



const obj = [];
var record = {};
var data = [
    {
        "userId": "123",
        "name": "John",
        "phoneNumber": "123-456-6789"
    },
    {
        "userId": "345",
        "name": "Summer",
        "phoneNumber": "535-631-9742"
    },
    {
        "userId" : "789",
        "name": "David",
        "phoneNumber": "633-753-1352"
    }
]

var dataLen = data.length;
var people = data;

createKeyValue = ((key, value) => {
    var temp = {};
    temp["value"] = value;
    obj[key] = temp;
});

apiCall = ((record) => {
    clientInformation.record.addRecord.then((resp) => {
        console.log(resp);
    }).catch((err) => {
        console.log(err);
    });
});

async function asyncFunction(record) {
    let promise = new Promise((resolve, reject) => {
        setTimeout(() => apiCall(record), 1000)
    });
    let result = await promise;
    console.log(result);
}

while (dataLen > 0) {
    for (let [key, value] of Object.entries(data[0])) {
        switch(key) {
            case 'userId':
                createKeyValue(key, value);
                break;
            case 'name':
                createKeyValue(key, value);
                break;
            default:
        }
    }
    
    record["record"] = obj;
    asyncFunction(record);
    data.shift();
    dataLen -= 1;

    
}

这是每个已处理数据的屏幕截图。 截屏

标签: javascriptapiasynchronous

解决方案


我想你还没有理解for loop里面的while工作原理。data应该每次递增以获取内部的下一个数组data

data[0] => { userId: 123 ... }, data[1] => { userId: 345 ... } and so on。_

在每次for loop迭代中检查每个子数组的 3 个元素,因此每次都temp存储userId and name. 因此,当循环完成时,temp包含 askey => userId, name和相应的值。

    var data = [
        {
            "userId": "123",
            "name": "John",
            "phoneNumber": "123-456-6789"
        },
        {
            "userId": "345",
            "name": "Summer",
            "phoneNumber": "535-631-9742"
        },
        {
            "userId" : "789",
            "name": "David",
            "phoneNumber": "633-753-1352"
        }
    ]

    var dataLen = data.length;
        
    let i = 0 ;
        while ( i < dataLen) {
            
            let temp = [];
            
        for (let [key, value] of Object.entries(data[i])) {
                
             if(key == 'userId' || key == 'name'){
                   temp[key] = value;   
                  }
                                
        }
            
                //Just to print the values and understand
            for(let k in temp){
                      console.log(k+" -> "+temp[k]);
                }
             
              //here you will pass the temp values to functions
              console.log(" At each iteration execute the required functions ");
            
              //asyncFunction(temp);
              i += 1;

            
       }


推荐阅读