2017-02-23 34 views
0

Я тянущая информацию из API, который имеет следующий формат ответ:В Node.js, асинхронная рекурсивная функция разрешение пустых обещаний

{ 
    items: [{}, {}, {}], 
    nextPage: { 
    startIndex: 11 
    } 
} 

, так что я написал эту программу, которая проверяет, есть ли nextPage недвижимости , и я делаю последующий запрос API со смещением = startIndex. Вот мой код:

Serp.prototype.search = function(query, start, serps) { 
    let deferred = this.q.defer(); 
    let url = ''; 
    if (start === 0) { 
    url = `${GCS_BASE}/?key=${this.key}&cx=${this.cx}&q=${query}`; 
    } else { 
    url = `${GCS_BASE}/?key=${this.key}&cx=${this.cx}&q=${query}&start=${start}`; 
    } 

    this.https.get(url, (res) => { 
    let rawData = ''; 

    res.on('data', (chunk) => { 
     rawData += chunk; 
    }); 

    res.on('end',() => { 
     let contactInfo = []; 
     let result = JSON.parse(rawData); 
     let totalResults = result.searchInformation.totalResults; 

     // if total results are zero, return nothing. 
     if (totalResults === 0) { 
     serps.push(contactInfo); 
     deferred.resolve(serps); 
     // there's just one page of results. 
     } else if (totalResults <= 10) { 
     contactInfo = this._extractContactInfo(result.items, query.toLowerCase()); 
     serps.push(contactInfo); 
     deferred.resolve(serps); 
     // if there are more than 10, then page through the response. 
     } else if ((totalResults > 10) && (result.queries.hasOwnProperty('nextPage'))) { 
     // recursively and asynchronously pull 100 results. 
     if (result.queries.nextPage[0].startIndex < 91) { 
      contactInfo = this._extractContactInfo(result.items, query.toLowerCase()); 
      serps.push(contactInfo); 
      this.search(query, result.queries.nextPage[0].startIndex, serps) 
      .then(() => { 
      deferred.resolve(); 
      }); 
     } else { 
      contactInfo = this._extractContactInfo(result.items, query.toLowerCase()); 
      serps.push(contactInfo); 
      let res = this.flatten(serps); 
      deferred.resolve(res); 
     } 
     } 
    }); 
    }); 

    return deferred.promise; 
}; 

Та часть кода работает нормально, проблема возникает, когда я пытаюсь позвонить, что search функция я писал так:

let promises = keywords.map((keyword) => { 
    return Serps.search(keyword, startIndex, serps); 
    }); 

    q.allSettled(promises) 
    .then((results) => { 
    console.log(results); // [ { state: 'fulfilled', value: undefined } ] 
    } 

Моя проблема заключается в том, что выполняются обещания, но значение не определено.

Так что я делаю неправильно, и как я могу это исправить?

ответ

0

Я решил проблему, не возвращая пустое обещание здесь:

this.search(query, result.queries.nextPage[0].startIndex, serps) 
    .then(() => { 
     deferred.resolve(serps); 
    }); 

мне еще нужно, чтобы сгладить результаты, так что, возможно, есть более умное решение, до сих пор, что работает отлично.