我在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"
的值为空字符串。我该如何处理?
答案 0 :(得分:1)
有两种方法可以解决您的问题。
i,e,让你的AJAX调用同步。 在这种方法中,您失去了异步ajax调用的好处。
所以我的想法是,什么时候推送你检索到的联系信息,你只需要在数组中得到它的位置,然后将这个位置值传递给获取照片的函数,这样在检索照片数据后,只需设置它可以纠正回复的检索到的联系信息。
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]);
});
}