Странно поведение массивов promises js
Странно ведет себя код: в блоке try если закомментировать один из массивов arr1 и оставить другой, все хорошо работает, вот сам код:
'use strict'; var InstagramPrivateAPI = {}; InstagramPrivateAPI = {}; InstagramPrivateAPI.V1 = require(__dirname + '/client/v1'); InstagramPrivateAPI.Helpers = require(__dirname + '/helpers'); var acc = require(__dirname + "/client/v1/account"); var med = require(__dirname + "/client/v1/media") var Promise = require('../bluebird'); var _ = require('../lodash/'); module.exports = InstagramPrivateAPI; var Client = require('instagram-private-api').V1; var device = new Client.Device('maksgmn'); var storage = new Client.CookieFileStorage(__dirname + '/cookies/maksgmn.json'); var session = new Client.Session(device, storage); function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min)) + min; } var fs = require('fs'); var proxyArray = fs.readFileSync('proxy.txt').toString().split("\n"); var usernamesArray = fs.readFileSync('usernames.txt').toString().split("\n"); var proxy = "http://" + proxyArray[getRandomInt(0,proxyArray.length)] var username = usernamesArray[getRandomInt(0,usernamesArray.length)] console.log(proxy) console.log(username) Client.Request.setProxy(proxy); acc.searchForUser(session, 'shakila_popi') //поиск id пользователя .then(function(profile) { return profile.id }) .then(function(someId) { //получение промиса lenta var feed = new Client.Feed.UserMedia(session, someId); var lenta = Promise.mapSeries(_.range(0, 1), function() { return feed.get(); }).then(function(lenta) { return {id: someId, fd : lenta} }) return lenta }) .then(function(results) { //обработка промиса и получение ленты пользователя // result should be Media[][] var media = _.flatten(results.fd); var urls = _.map(media, function(medium) { try { var arr1 = medium.params.images[0].url; //var arr2 = medium.params.carouselMedia[0].images[0].url; return arr1 } catch (err) { console.log("lala") } //console.log(medium.params.carouselMedia.images[0].url) }); return {id : results.id, links : urls} }) .then(function(mediaAndId) { acc = acc.getById(session, mediaAndId.id) .then(function(account) { //console.log(account.params) let avatar = account.params.profilePicUrl; let fullName = account.params.fullName; let bio = account.params.biography; let media0 = mediaAndId.links[0]; let media1 = mediaAndId.links[1]; let media2 = mediaAndId.links[2]; let media3 = mediaAndId.links[3]; let media4 = mediaAndId.links[4]; //console.log(avatar); //console.log(fullName); console.log(bio); console.log(media0); console.log(media1); console.log(media2); console.log(media3); console.log(media4); }) }) Вот вывод в консоль: MacBook-Pro-Sparrow:instagram-private-api Sparrow$ node index.js [url]http://0DHVbZ:VkScLB@81.177.22.235:31061[/url] superfoxyasians (node:58742) Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification. [url]https://instagram.fhel3-1.fna.fbcdn.net/vp/551ca4099cea5337ce8317fdf888476b/5C7DB2A0/t51.2885-15/e35/46253156_552428008532000_5574512654800613278_n.jpg?ig_cache_key=MTkxMjIzMDIyNjQzNjU4NjU0Mg%3D%3D.2[/url] undefined [url]https://instagram.fhel3-1.fna.fbcdn.net/vp/10925f7f377b775b4a9fef5e2c7dc562/5C8CDEF0/t51.2885-15/e35/43985135_344052449735185_8327097767917702849_n.jpg?ig_cache_key=MTkwODU3MjU4MzQ0ODg5MTM3MA%3D%3D.2[/url] undefined [url]https://instagram.fhel3-1.fna.fbcdn.net/vp/82606b2a0741e97a416ca517a9494246/5BF43704/t51.2885-15/e35/43779615_1078737292285840_8766820240873976874_n.jpg[/url] Вот код если закомментировать arr1 и оставить arr2 (тут блоки catch срабатывают): 'use strict'; var InstagramPrivateAPI = {}; InstagramPrivateAPI = {}; InstagramPrivateAPI.V1 = require(__dirname + '/client/v1'); InstagramPrivateAPI.Helpers = require(__dirname + '/helpers'); var acc = require(__dirname + "/client/v1/account"); var med = require(__dirname + "/client/v1/media") var Promise = require('../bluebird'); var _ = require('../lodash/'); module.exports = InstagramPrivateAPI; var Client = require('instagram-private-api').V1; var device = new Client.Device('maksgmn'); var storage = new Client.CookieFileStorage(__dirname + '/cookies/maksgmn.json'); var session = new Client.Session(device, storage); function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min)) + min; } var fs = require('fs'); var proxyArray = fs.readFileSync('proxy.txt').toString().split("\n"); var usernamesArray = fs.readFileSync('usernames.txt').toString().split("\n"); var proxy = "http://" + proxyArray[getRandomInt(0,proxyArray.length)] var username = usernamesArray[getRandomInt(0,usernamesArray.length)] console.log(proxy) console.log(username) Client.Request.setProxy(proxy); acc.searchForUser(session, 'shakila_popi') //поиск id пользователя .then(function(profile) { return profile.id }) .then(function(someId) { //получение промиса lenta var feed = new Client.Feed.UserMedia(session, someId); var lenta = Promise.mapSeries(_.range(0, 1), function() { return feed.get(); }).then(function(lenta) { return {id: someId, fd : lenta} }) return lenta }) .then(function(results) { //обработка промиса и получение ленты пользователя // result should be Media[][] var media = _.flatten(results.fd); var urls = _.map(media, function(medium) { try { //var arr1 = medium.params.images[0].url; var arr2 = medium.params.carouselMedia[0].images[0].url; return arr2 } catch (err) { console.log("lala") } //console.log(medium.params.carouselMedia.images[0].url) }); return {id : results.id, links : urls} }) .then(function(mediaAndId) { acc = acc.getById(session, mediaAndId.id) .then(function(account) { //console.log(account.params) let avatar = account.params.profilePicUrl; let fullName = account.params.fullName; let bio = account.params.biography; let media0 = mediaAndId.links[0]; let media1 = mediaAndId.links[1]; let media2 = mediaAndId.links[2]; let media3 = mediaAndId.links[3]; let media4 = mediaAndId.links[4]; //console.log(avatar); //console.log(fullName); console.log(bio); console.log(media0); console.log(media1); console.log(media2); console.log(media3); console.log(media4); }) }) и вывод соответственно: MacBook-Pro-Sparrow:instagram-private-api Sparrow$ node index.js [url]http://6bZS68:5jWBwC@81.177.22.235:31000[/url] eldlagorra (node:58745) Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification. lala lala lala lala undefined [url]https://instagram.fhel3-1.fna.fbcdn.net/vp/4a919f055c8cfabcfdd25ef2cbe4e990/5C800DE9/t51.2885-15/e35/44284874_657896204605028_2619340850189862370_n.jpg?ig_cache_key=MTkxMTkwMDgyMTk1Njk3NzYwOQ%3D%3D.2[/url] undefined [url]https://instagram.fhel3-1.fna.fbcdn.net/vp/4d25561f82fb60b311813ed9b84c88db/5C7EFBCB/t51.2885-15/e35/44374724_186168655643109_6032140732754326020_n.jpg?ig_cache_key=MTkwNjM5NDUyNzQ2MDQxNzUyMg%3D%3D.2[/url] undefined Вообще, так как не получается нормально вытащить все типы постов из ленты(возвращается json), поэтому я ввел 2 массива - первый для обычных постов и видео, второй для карусели. По отдельности они хорошо работают, хотел их сливать в arr3 и уже работать с ним. Однако не получается по вышеописанной причине. Обьясните пожалуйста и ткните в чем может быть проблема? |
Решил проблему добавлением еще одного промиса:
'use strict'; var InstagramPrivateAPI = {}; InstagramPrivateAPI = {}; InstagramPrivateAPI.V1 = require(__dirname + '/client/v1'); InstagramPrivateAPI.Helpers = require(__dirname + '/helpers'); var acc = require(__dirname + "/client/v1/account"); var med = require(__dirname + "/client/v1/media") var Promise = require('../bluebird'); var _ = require('../lodash/'); module.exports = InstagramPrivateAPI; var Client = require('instagram-private-api').V1; var device = new Client.Device('maksgmn'); var storage = new Client.CookieFileStorage(__dirname + '/cookies/maksgmn.json'); var session = new Client.Session(device, storage); function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min)) + min; } var fs = require('fs'); var proxyArray = fs.readFileSync('proxy.txt').toString().split("\n"); var usernamesArray = fs.readFileSync('usernames.txt').toString().split("\n"); var proxy = "http://" + proxyArray[getRandomInt(0,proxyArray.length)] var username = usernamesArray[getRandomInt(0,usernamesArray.length)] console.log(proxy) console.log(username) Client.Request.setProxy(proxy); acc.searchForUser(session, username) //поиск id пользователя .then(function(profile) { return profile.id }) .then(function(someId) { //получение промиса lenta var feed = new Client.Feed.UserMedia(session, someId); var lenta = Promise.mapSeries(_.range(0, 1), function() { return feed.get(); }).then(function(lenta) { return {id: someId, fd : lenta} }) return lenta }) .then(function(results) { //обработка промиса и получение ленты пользователя // result should be Media[][] var media1 = _.flatten(results.fd); var urls1 = _.map(media1, function(medium) { //var arr1 = medium.params.images[0].url; var arr1 = [] try { arr1 = medium.params.images[0].url } catch (err) { //console.log("lala") } return arr1; //console.log(medium.params.carouselMedia.images[0].url) }) //console.log(urls1) return {id : results.id, linksNoCarousel : urls1, med : media1} }) .then(function(res){ var urls2 = _.map(res.med, function(medium) { var arr2 = [] try { arr2 = medium.params.images[0][0].url //console.log(arr2) } catch (err) { } return arr2 }) for (var i = 0; i < 5; i++) { if (typeof res.linksNoCarousel[i] == "undefined") res.linksNoCarousel[i] = urls2[i]; } var arr3 = [] for (var i = 0; i < 5; i++) { arr3[i] = res.linksNoCarousel[i] } return {id : res.id, links : arr3} }) .then(function(mediaAndId) { acc = acc.getById(session, mediaAndId.id) .then(function(account) { //console.log(account.params) let avatar = account.params.profilePicUrl; let fullName = account.params.fullName; let bio = account.params.biography; let media0 = mediaAndId.links[0]; let media1 = mediaAndId.links[1]; let media2 = mediaAndId.links[2]; let media3 = mediaAndId.links[3]; let media4 = mediaAndId.links[4]; console.log(avatar); console.log(fullName); console.log(bio); console.log(media0); console.log(media1); console.log(media2); console.log(media3); console.log(media4); }) }) |
Часовой пояс GMT +3, время: 19:18. |