2017-01-02 129 views
1

我打电话一个Ajax请求中forEach循环,但问题是,从阿贾克斯收到的响应时间,循环结束后(如果我没看错)如何使forEach循环中调用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

什么是预期的返回值()'电话? getApiResponse是同步的吗? – guest271314

+0

@ guest271314返回值是一个byteArray。我不认为'getApiResponse'是同步的。我没有同步,因为我读的地方不是很好的做法 – Satyadev

+0

@Satyadev如果'entry.phoneNumber'是一个空字符串,预期的结果是什么?如果'getApiResponse'是异步的,那么你为什么要在'getPhotos'调用中立即返回base64Image'?你期望'retrieveContacts.profileData'值是什么? – guest271314

回答

1

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

1.你让Ajax调用NOT-异步

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不是全局变量,代码可能像以下更新:从`getContacts

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]); 
     }); 
    } 
+0

'retrieveContactsArr'不能在'getPhotos'函数中访问 – Satyadev

+0

为什么'retrieveContactsArr'不可访问?是不是在全局范围内定义的? – Codemole

+0

是的,它不在全局范围内,我将它改为:function getPhotos(retrieveContactsArr, url,token,pos)'和函数调用如下:'getPhotos(retrieveContactsArr,entry.photo,req.token,retrieveContactsPos);'但我不确定这是否正确? – Satyadev