如何在forEach循环中进行ajax调用

时间:2017-01-02 15:54:00

标签: javascript ajax foreach

我在forEach循环中调用ajax请求,但问题是,当从ajax收到响应时,循环结束(如果我没有错)

forEach循环:

var retrievedContacts = {};
var retrievedContactsArr = [];
contacts.getContacts(function (err, contacts) {
    contacts.forEach(function (entry) {
        if (entry.phoneNumber !== '') {
            retrievedContacts = {
                contact: {
                    "address": {
                        "home": "",
                        "office": ""
                    }
                },
                "profileData": getPhotos(entry.photo, req.token)
            };
            retrievedContactsArr.push(retrievedContacts);
        }
    });
});

函数调用是上述代码中的这一行"profileData": getPhotos(entry.photo, req.token)

功能:

function getPhotos(url, token){
    var base64Image = '';
    getApiResponse(url+"?access_token="+token,"", function (res1) {
        if (res1.error) {
            console.log('Could not fetch google photos......', res1.error);
        } else {
            base64Image = new Buffer.from(res1.body).toString('base64');
            console.log('base64 is.........................', base64Image);
        }
    });
    return base64Image;
}

Ajax电话:

function getApiResponse(url, params, next) {
    unirest.get(url)
    .query(params)
    .timeout(60000)
    .end(function (res) {
        if (next)
            next(res);
    });
}

我能够打印响应但无法将其返回给调用函数。 "profileData"的值为空字符串。我该如何处理?

1 个答案:

答案 0 :(得分:1)

有两种方法可以解决您的问题。

1。你使ajax调用NOT-asynchronous

i,e,让你的AJAX调用同步。 在这种方法中,您失去了异步ajax调用的好处。

2。更改代码的逻辑。 (推荐!)

所以我的想法是,什么时候推送你检索到的联系信息,你只需要在数组中得到它的位置,然后将这个位置值传递给获取照片的函数,这样在检索照片数据后,只需设置它可以纠正回复的检索到的联系信息。

var retrievedContacts = {};
var retrievedContactsArr = [];
contacts.getContacts(function (err, contacts) {
    contacts.forEach(function (entry) {
        if (entry.phoneNumber !== '') {
            retrievedContacts = {
                contact: {
                    "address": {
                        "home": "",
                        "office": ""
                    }
                },
                "profileData": false
            };
            retrievedContactsArr.push(retrievedContacts);
            var retrievedContactsPos = retrievedContactsArr.length - 1;
            getPhotos(entry.photo, req.token, retrievedContactsPos);
        }
    });
});



function getPhotos(url, token, pos){
    var base64Image = '';
    getApiResponse(url+"?access_token="+token,"", [pos, function (res1, pos)      {
        if (res1.error) {
            console.log('Could not fetch google photos......', res1.error);
        } else {
            base64Image = new Buffer.from(res1.body).toString('base64');
            retrievedContactsArr[pos]["profileData"] = base64Image;
        }
    }]);
}

function getApiResponse(url, params, next) {
    unirest.get(url)
    .query(params)
    .timeout(60000)
    .end(function (res) {
        if (next)
            next[1](res, next[0]);
    });
}

如果r etrievedContactsArr不是全局变量,则代码可能会更新如下:

var retrievedContacts = {};
    var retrievedContactsArr = [];
    contacts.getContacts(function (err, contacts) {
        contacts.forEach(function (entry) {
            if (entry.phoneNumber !== '') {
                retrievedContacts = {
                    contact: {
                        "address": {
                            "home": "",
                            "office": ""
                        }
                    },
                    "profileData": false
                };
                retrievedContactsArr.push(retrievedContacts);
                var retrievedContactsPos = retrievedContactsArr.length - 1;
                getPhotos(entry.photo, req.token, retrievedContactsArr, retrievedContactsPos);
            }
        });
    });



    function getPhotos(url, token, retrievedContactsArr, pos){
        var base64Image = '';
        getApiResponse(url+"?access_token="+token,"", [retrievedContactsArr, pos, function (res1, pos)      {
            if (res1.error) {
                console.log('Could not fetch google photos......', res1.error);
            } else {
                base64Image = new Buffer.from(res1.body).toString('base64');
                retrievedContactsArr[pos]["profileData"] = base64Image;
            }
        }]);
    }

    function getApiResponse(url, params, next) {
        unirest.get(url)
        .query(params)
        .timeout(60000)
        .end(function (res) {
            if (next)
                next[2](res, next[0], next[1]);
        });
    }