【发布时间】:2017-05-16 17:38:36
【问题描述】:
我在 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" 的值为空字符串。我该如何处理?
【问题讨论】:
-
getContacts()调用的预期返回值是多少?getApiResponse是同步的吗? -
@guest271314 返回值是一个字节数组。我不认为 `getApiResponse' 是同步的。我在某处阅读时没有进行同步,这不是一个好习惯
-
@Satyadev 如果
entry.phoneNumber是一个空字符串,预期的结果是什么?如果getApiResponse是异步的,你为什么要在getPhotos调用中立即return base64Image?你认为retrievedContacts.profileData的值是多少? -
getApiResponse返回的值在哪里?你是对的,.forEach()不等待getPhotos()返回值。您可以一次执行一个调用,直到没有更多索引可以从contacts数组中获取值。
标签: javascript ajax foreach