Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.11.2018, 13:37
Новичок на форуме
Отправить личное сообщение для mystica Посмотреть профиль Найти все сообщения от mystica
 
Регистрация: 18.11.2018
Сообщений: 8

Как передать два значения внутрь promise js
Доброго времени суток! Работаю с приватным апи инстаграма, пытаюсь передать внутрь промиса (тот что после комментария в коде) 2 значения: мне бы хотелось передать айди пользователя и переменную lenta, на данном этапе удается передать только lenta:

'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);

acc.searchForUser(session, 'kaigreene')
    .then(function(profile) {
        return profile.id
    })
    .then(function(someId) {
        var feed = new Client.Feed.UserMedia(session, someId);
        var lenta = Promise.mapSeries(_.range(0, 1), function() {
            return feed.get();
        })
        return lenta
    })
    //that one promise that needs lenta and user id to be transfered
    .then(function(results) {
        // result should be Media[][]
        var media = _.flatten(results);
        var urls = _.map(media, function(medium) {
            return medium.params.imageVersions2.candidates[0].url
        });
        console.log(urls)
    })


В результате console.log(urls) получается следующее:

[ 'https://scontent-arn2-1.cdninstagram.com/vp/6af16d285248021beb138878d39300f5/5C7ABDF2/t51.2885-15/e35/44564146_322592125137172_4748922672367052265_n.jpg?ig_cache_key=MTkxNTA2MzY3NjkyMDg3NzI4NQ%3D%3D.2',
  'https://scontent-arn2-1.cdninstagram.com/vp/fafb1cbedf2f2ee526b53bbbe19242e0/5BF37B8A/t51.2885-15/e15/p640x640/43536314_2236965789913961_7161939884150660296_n.jpg',
  'https://scontent-arn2-1.cdninstagram.com/vp/40aa382750e5e94a6e66d57c61381280/5C7E3B85/t51.2885-15/e35/44183920_263573101019253_2196926879861470922_n.jpg?ig_cache_key=MTkxNDI0NTA3MjY5NjQ0Mzg2MQ%3D%3D.2',
  'https://scontent-arn2-1.cdninstagram.com/vp/0f494a3130df8f5e9020adba2aaeaaa1/5C8D533C/t51.2885-15/e35/44453843_206191696937914_2654101859534502211_n.jpg?ig_cache_key=MTkxNDA4NDAwNzQ1NTExMjY3Mw%3D%3D.2',
  'https://scontent-arn2-1.cdninstagram.com/vp/891e76d89e68cef102ca82891bd79500/5C7D169D/t51.2885-15/e35/45513332_314414985821365_5157081956783129672_n.jpg?ig_cache_key=MTkxNDAxOTA3MjAzNzQ2OTc0OA%3D%3D.2',
  'https://scontent-arn2-1.cdninstagram.com/vp/8630ce604e8fc13c4b0f8dea529066c3/5BF360C2/t51.2885-15/e15/44277878_2176945342563453_2262613550408503718_n.jpg',
  'https://scontent-arn2-1.cdninstagram.com/vp/10c7c4f145e8c749d9865b9042b594ba/5C6D275A/t51.2885-15/e35/44589483_282353665729077_4185404619021489633_n.jpg?ig_cache_key=MTkxMzQ2NTEyMjA3MDQ3Mjk2NA%3D%3D.2',
  'https://scontent-arn2-1.cdninstagram.com/vp/c99a00b3d36a5013736920475b98cadb/5C8D2738/t51.2885-15/e35/44850363_1912754462367214_2546260771931931006_n.jpg?ig_cache_key=MTkxMzMwMzc3ODc4ODY5NDI0Mg%3D%3D.2',
  'https://scontent-arn2-1.cdninstagram.com/vp/b850a45fe4cc20a93da64857aee9575c/5C8D1984/t51.2885-15/e35/44634212_1869528946493492_7969207514966425740_n.jpg?ig_cache_key=MTkxMjc0MTYxMDc4NzgwOTAzNQ%3D%3D.2',
  'https://scontent-arn2-1.cdninstagram.com/vp/28e6be91c8fc996dfc47b8ea3e9781d6/5BF3CAE9/t51.2885-15/e15/43398735_115170416088701_3256913169852741968_n.jpg',
  'https://scontent-arn2-1.cdninstagram.com/vp/60e627e88aeef3ded3466d1e8a80f6fd/5BF3E157/t51.2885-15/e15/43258810_358264328256668_5269209695486174863_n.jpg',
  'https://scontent-arn2-1.cdninstagram.com/vp/85487f3fb5b805ce3fc63b40a9d5e121/5BF35B86/t51.2885-15/e15/s640x640/43504006_685794225133434_1066643086450380052_n.jpg' ]


Следующий код (возвращается id и lenta) по какой-то причине не хочет работать:

'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);

acc.searchForUser(session, 'kaigreene')
    .then(function(profile) {
        return profile.id
    })
    .then(function(someId) {
        var feed = new Client.Feed.UserMedia(session, someId);
        var lenta = Promise.mapSeries(_.range(0, 1), function() {
            return feed.get();
        })
        return {id : someId, fd : lenta}
    })
    //that one promise that needs lenta and user id to be transfered
    .then(function(results) {
        // result should be Media[][]
        var media = _.flatten(results.fd);
        var urls = _.map(media, function(medium) {
            return medium.params.imageVersions2.candidates[0].url
        });
        console.log(urls)
    })



Подскажите как быть тут?
Ответить с цитированием
  #2 (permalink)  
Старый 18.11.2018, 14:11
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,565

Дело в том что lenta - это тоже промис. Когда ты возвращаешь промис из промиса, то then "применяется" к возвращённому, и, соответсвенно, ждёт результата. Если же ты возращаешь простой объект, то результата lenta никто не ждёт и в _.flatten(results.fd) вместо полученного результата попадает ещё не выполненный(pending) промис.
var lenta = Promise.mapSeries(_.range(0, 1), function() {
  return feed.get();
})
return {id : someId, fd : lenta}
->
return Promise.mapSeries(_.range(0, 1), function() {
  return feed.get();
}).then(function(lenta){
  return {id : someId, fd : lenta}
})
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 18.11.2018, 15:25
Новичок на форуме
Отправить личное сообщение для mystica Посмотреть профиль Найти все сообщения от mystica
 
Регистрация: 18.11.2018
Сообщений: 8

Большое спасибо, очень помогли, видимо еще буду создавать темы на форуме, в целом у меня уже получился парсер, код ниже, только я не знаю как его нормально заставить работать в многопоток, взаимодействовать с клиентом и щас разберусь с прокси

'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);


acc.searchForUser(session, 'kaigreene') //поиск 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) {
            return medium.params.imageVersions2.candidates[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);
    		})
    })
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как передать значение из js в базу данных и обратно andrey.puzanov AJAX и COMET 50 15.11.2017 21:53
Как подключить один js во внутрь другого? Jeremen Общие вопросы Javascript 0 21.09.2012 13:57
Как передавать параметры из php скрипта в js imissyouso Общие вопросы Javascript 3 01.08.2012 18:24
есть ли в js понятие частоты кадров, наподобие как во флэше? andrew_F Общие вопросы Javascript 8 01.05.2012 20:25
Передать несколько значений из JS на сервер, методом POST балерун Общие вопросы Javascript 1 02.03.2010 14:36