我无法找到正确的方法:
我正在为产品调用外部API,我得到一个回复我想将这些产品添加到我的数据库中,如果响应包含next_page网址,则再次循环,直到没有next_page为止
以下是我提出的建议:
var products = api.ProductsActive('GET', {includes: 'Images', limit: 1});
requestProducts = function(){
products.results.forEach(function(product){
var sameproduct = apiProducts.findOne({listing_id: product.listing_id});
if (sameproduct) {
console.log('found sameproduct');
return;
}
//Add userId to current product so we can assosicate products belong to "X" user
var productExtend = _.extend(product, {userId: Meteor.userId()});
apiProducts.insert(productExtend);
});
//If there is next page get the next page number and get products
var nextPage = products.pagination.next_page;
if (nextPage !== null) {
products = api.ProductsActive('GET', {includes: 'Images', page: nextPage, limit: 1});
console.log(products);
}
};
//loop at least once, and then if more pages found
do {
requestProducts();
}
while (products.pagination.next_page !== null);
哪个似乎无法正常工作我不确定这是否是这种功能的正确方法我真的很有帮助你的输入!请帮我找出正确的方法!
答案 0 :(得分:0)
请记住,javascript是异步的,因此您需要使用回调而不是do
来处理循环。原因是requestProducts可能使用回调而javascript解释器没有"等待" requestProducts()
在运行下一行代码之前完成运行。
您尚未提供有关api如何工作的任何详细信息,因此我必须进行概括。
如果requestProducts()
将参数作为回调(它应该),请使用该参数重新运行:
var callback = function(err, result) {
if(products.pagination.next_page !== null) requestProducts(callback);
};
requestProducts(callback);
您必须检查您的api文档以检查回调是如何定义的,但如果出现问题,将会返回上面err
的内容。
这是如何工作的,当调用requestProducts时,回调会触发,如果它不是最后一页重复自己,直到..next_page == null