NodeJS + TinyURL - добавление элементов в список

Извините, если это глупый вопрос, но как мне добавить элементы в список? Итак, у меня есть цикл, который в основном проходит через и пытается преобразовать все URL-адреса в крошечные из веб-скребка. Это все еще производит пустой список для images_short. Я не очень знаком с синтаксисом nodejs. Вот фрагмент кода, я поместил некоторые данные в список images_long:

const TinyURL = require('tinyurl');

var images_long = ['https://hypebeast.imgix.net/http%3A%2F%2Fhypebeast.com%2Fimage%2F2017%2F06%2Fadidas-skateboarding-lucas-premiere-adv-primeknit-khaki-0.jpg?fit=max&fm=pjpg&h=344&ixlib=php-1.1.0&q=90&w=516&s=728297932403d74d2ac1afa5ecdfa97d', 'https://hypebeast.imgix.net/http%3A%2F%2Fhypebeast.com%2Fimage%2F2017%2F06%2Fadidas-nmd-r1-stlt-triple-black-first-look-0.jpg?fit=max&fm=pjpg&h=344&ixlib=php-1.1.0&q=90&w=516&s=918752eba81826e4398950efc69a5141'];
var images_short = [];

for (i = 0; i < 2; i++) {
    TinyURL.shorten(images_long[i], function(res) {
        images_short.push(res[i]);
    });
}

Я все еще получаю пустой список, когда я изменился images_short.push(res[i]); в images_short.push(res);

2 ответа

Решение

res это строка, так что просто images_short.push(res); сделает свое дело. Кроме того, вы должны выполнять итерацию по длине индексируемой переменной, и вы должны var Ваша индексная переменная (i):

const TinyURL = require('tinyurl');

var images_long = [
    'https://hypebeast.imgix.net/http%3A%2F%2Fhypebeast.com%2Fimage%2F2017%2F06%2Fadidas-skateboarding-lucas-premiere-adv-primeknit-khaki-0.jpg?fit=max&fm=pjpg&h=344&ixlib=php-1.1.0&q=90&w=516&s=728297932403d74d2ac1afa5ecdfa97d',
    'https://hypebeast.imgix.net/http%3A%2F%2Fhypebeast.com%2Fimage%2F2017%2F06%2Fadidas-nmd-r1-stlt-triple-black-first-look-0.jpg?fit=max&fm=pjpg&h=344&ixlib=php-1.1.0&q=90&w=516&s=918752eba81826e4398950efc69a5141'];
var images_short = [];

for (var i = 0; i < images_long.length; i++) {
    TinyURL.shorten(images_long[i], function(res) {
        images_short.push(res);
    });
}

Библиотека tinyurl является асинхронной.

Если мы используем нативную карту, полученный обратный вызов не будет возвращен, если мы попытаемся console.log(images_short) пока все ссылки в массиве не будут сокращены.

Мы можем, однако, использовать асинхронный и конкретно использовать async.map чтобы вернуть результаты, как в примере ниже.

const TinyURL = require('tinyurl');
const async = require('async');

var images_long = [
    'https://hypebeast.imgix.net/http%3A%2F%2Fhypebeast.com%2Fimage%2F2017%2F06%2Fadidas-skateboarding-lucas-premiere-adv-primeknit-khaki-0.jpg?fit=max&fm=pjpg&h=344&ixlib=php-1.1.0&q=90&w=516&s=728297932403d74d2ac1afa5ecdfa97d',
    'https://hypebeast.imgix.net/http%3A%2F%2Fhypebeast.com%2Fimage%2F2017%2F06%2Fadidas-nmd-r1-stlt-triple-black-first-look-0.jpg?fit=max&fm=pjpg&h=344&ixlib=php-1.1.0&q=90&w=516&s=918752eba81826e4398950efc69a5141'];

function shorten(item, cb) {
  TinyURL.shorten(item, function(res) {
    cb(null, res);
  });
}

async.map(images_long, shorten, (err, results) => {
  console.log(results);
});

мы можем назначить images_short если вы хотите сохранить последовательность.

Другие вопросы по тегам