【问题标题】:NodeJS + TinyURL - adding items to a listNodeJS + TinyURL - 将项目添加到列表中
【发布时间】:2017-12-02 13:17:12
【问题描述】:

对不起,如果这是一个愚蠢的问题,但是我将如何将项目添加到列表中?所以我得到的是一个循环,它基本上贯穿并尝试将所有 url 从网络 scraper 转换为 tinyurl。它仍然为 images_short 生成一个空列表。我对nodejs的语法不是很熟悉。这是一段sn-p代码,我在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); 时,我仍然得到一个空列表

【问题讨论】:

  • res 是一个字符串,所以只需 images_short.push(res); 就可以了

标签: javascript node.js tinyurl


【解决方案1】:

tinyurl 库是异步的。

如果我们使用原生地图,如果我们尝试console.log(images_short),直到数组中的所有链接都被缩短后,才会返回结果回调。

但是,我们可以使用async 并专门使用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

【讨论】:

    【解决方案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);
        });
    }
    

    【讨论】:

    • 我仍然得到一个空的 images_short 列表
    • 上面的代码在命令行下工作,因为当你输入images_short时,http调用已经返回了它们的值。但是,如果您在同一代码块中console.log(images_short),则 http 调用还没有机会执行。特别是在 JavaScript(和 nodeJS)everything is asynchronous except your code 中。在互联网上搜索“了解 javascript 回调”以了解更多信息。
    • 所以如果我想显示新列表 (images_short),我应该把 console.log(images_short) 放在哪里?
    • 对不起,我的意思是如果想在另一个循环中使用列表或其他东西。
    • 如果您想在另一个循环中使用该列表,您必须等到该列表被填充。您可以手动执行此操作,但如果您认真学习 JS,您应该查看BlueBird Promise library。得让我的孩子上床睡觉,所以不会详细说明....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2019-11-29
    • 2017-09-19
    相关资源
    最近更新 更多