首页 > 解决方案 > 在for循环中调用多个API并使用node js得到一一响应

问题描述

我必须在 for 循环中使用 promise all 调用多个 API,但我得到的是非顺序格式的响应。例如,我有 3 行,但以 1、2、3 的顺序得到响应。首先获得第一行响应而不是第三行,然后获得第二行,但我需要以顺序格式获得响应,例如(1 行,2 行,3 行)。

result = '{"error_code":0,"err_desc":null,"data":[{"":"","name":"OTT, KATHRYN M","address":"3110 Horseshoe Trl, Glenmoore, PA","email":"","phone1":"(410) 599-2212","phone2":"(610) 827-9107","phone3":"(610) 308-4566","phone4":"(610) 506-1121","phone5":"(610) 469-0737","phone6":"(610) 942-4347","phone7":"323-7898","phone8":"(814) 371-6133","phone9":""},{"":"","name":"BELTRANTE, SUSAN E","address":"3 Rhoads Ave, Moorestown, NJ\"","email":"SUSAN.BELTRANTE@AOL.COM, JOE.BARGER@YAHOO.COM,","phone1":"(856) 266-0381","phone2":"(856) 273-0869","phone3":"(609) 266-0381","phone4":"(856) 235-3933","phone5":"","phone6":"","phone7":"","phone8":"","phone9":""},{"":"","name":"Manish","address":"4895 E American Beauty Dr, Tucson, AZ 85756","email":"abc@gmail.com","phone1":"(857) 266-0381","phone2":"(857) 273-0869","phone3":"(610) 266-0381","phone4":"(857) 235-3933","phone5":"","phone6":"","phone7":"","phone8":"","phone9":""}]}';

var i;
                for (i = 0; i < result.length; i++) 
                //for (i = 0; i <= 0; i++) 
                { 
                    var phone = result[i].phone9;
                    var name = result[i].name;
                    var address = result[i].address;
                    var email = result[i].email;
                    var phone1 = result[i].phone1;
                    var phone2 = result[i].phone2;
                    var phone3 = result[i].phone3;
                    var phone4 = result[i].phone4;
                    var phone5 = result[i].phone5;
                    var phone6 = result[i].phone6;
                    var phone7 = result[i].phone7;
                    var phone8 = result[i].phone8;
                    
                    var addressinfo = address.split(',');
                    var street = addressinfo[0];
                    var city = addressinfo[1];
                    var state = addressinfo[2];
                    var zip = addressinfo[3];
                    
                    Promise.all([
                        fetch('https://backend.mioym.properties/api/247/eppraisal?street='+street+'&zip='+zip),
                        fetch('https://backend.mioym.properties/api/247/zillow?street='+street+'&zip='+zip),
                        fetch('https://backend.mioym.properties/api/247/pennymac?address='+address),
                        fetch('https://backend.mioym.properties/api/247/chase?address='+address),
                        fetch('https://backend.mioym.properties/api/247/realtor?address='+address)

                    ]).then(function (responses) {
                        // Get a JSON object from each of the responses
                        return Promise.all(responses.map(function (response) {
                            console.log("here"+i);
                            //console.log(response.json());
                            console.log(response.url);
                            return response.json();
                        }));
                    }).then(function (data) {
                        console.log("success"+i);
                        // Log the data to the console
                        // You would do something with both sets of data here
                        console.log(data);
                    }).catch(function (error) {
                        console.log("error"+i);
                        // if there's an error, log it
                        console.log(error);
                    });
                }                

所以请任何人建议我解决方案。

标签: node.jspromise

解决方案


Promise.all块内的第二个then不是必需的,因为它responses已经包含解析的值。请注意,Promise.all并行处理请求,但已解决的响应将按顺序排列。所以你可以简单地做:

Promise.all([
        fetch('https://backend.mioym.properties/api/247/eppraisal?street=' + street + '&zip=' + zip),
        fetch('https://backend.mioym.properties/api/247/zillow?street=' + street + '&zip=' + zip),
        fetch('https://backend.mioym.properties/api/247/pennymac?address=' + address),
        fetch('https://backend.mioym.properties/api/247/chase?address=' + address),
        fetch('https://backend.mioym.properties/api/247/realtor?address=' + address)

    ]).then(function (responses) {
    // Get a JSON object from each of the responses
      return responses.map(function (response) {            
        console.log(response.url);
        return response.json();
      });
});

推荐阅读