【问题标题】:array value is not updating in for loop in nodejsnodejs中的for循环中的数组值未更新
【发布时间】:2019-04-13 13:40:32
【问题描述】:

从下载功能下载图像后,我试图将数据推送到数组中。这是 nodejs 承诺中的一个问题。我该如何解决这个问题。

当前输出:

[
    {
        sku: 99104942591,
        retailer: 'JCREWFCT',
        images: []
    }
]

预期输出:

[
    {
        sku: 99103497136,
        retailer: 'JCREWFCT',
        images: [
            "http://localhost:4001/JCREWFCT/99103497136.png",
            "http://localhost:4001/JCREWFCT/99103497136_1.png"
        ]
    }
]

outputArr我正在尝试存储数据

 var downloadImages = async function() {
  var outputArr = [];
  for(var i=0; i<excelJsonArr.length; i++) {
    var d = excelJsonArr[i];
    var out = {
      sku : d.sku,
      retailer : d.retailer,
      images : []
    }
    if(d.image_link_1) {
      var saveDir = path.join('./public', d.retailer, d.sku+'.png');
      var imgUrl = properties.get('protocol') + '://' + properties.get('hostname') + ':' + properties.get('port') + '/' + d.retailer + '/' + d.sku + '.png';
      await download(d.image_link_1, saveDir, function(){
        out.images.push(imgUrl);
      });
    }

    if(d.image_link_2) {
      var saveDir = path.join('./public', d.retailer, d.sku+'_2.png');
      await download(d.image_link_1, saveDir, function(){
        var imgUrl = properties.get('protocol') + '://' + properties.get('hostname') + ':' + properties.get('port') + '/' + d.retailer + '/' + d.sku + '_2.png';
        out.images.push(imgUrl);
      });
    }

    outputArr.push(out);
  }
  console.log(outputArr);
}

var download = async function(uri, filename, callback){
  await request.head(uri, function(err, res, body){
    console.log('content-type:', res.headers['content-type']);
    console.log('content-length:', res.headers['content-length']);

    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
  });
};

【问题讨论】:

  • 看起来您正在使用 async/await 与不返回承诺的函数。这行不通。
  • 您是否从下载回调中得到响应?您可以注销吗?另外,我在以下情况下看到if(d.image_link_1) 您的var imgUrl 代码不在您的下载调用范围内。有什么特别的原因吗?

标签: javascript node.js promise es6-promise


【解决方案1】:

我不知道您的下载功能实际上是做什么的,但通常,在使用 asnyc 时,您会这样做:

await download(d.image_link_1, saveDir);
out.images.push(imgUrl);

我你应该尝试使用trycatch 任何来自下载的错误,请参阅:Correct Try…Catch Syntax Using Async/Await

仅供参考,下次分享您的更多代码,如果可能的话,分享可复制代码或示例 GitHub 存储库,以便我们自己查看错误。

【讨论】:

  • 他已经在做 await 了,虽然 try catch 也是一个好点
  • 是的,但他正在将图像推入函数内部而不是外部。我的回答是正确的,见上面@VaibhavKumarGoyal
【解决方案2】:

由于您使用的是asyncawait,因此您不需要使用回调函数。只需在await之后调用所需的函数

var downloadImages = async function () {
    var outputArr = [];
    for (var i = 0; i < excelJsonArr.length; i++) {
        var d = excelJsonArr[i];
        var out = {
            sku: d.sku,
            retailer: d.retailer,
            images: []
        }
        if (d.image_link_1) {
            var saveDir = path.join('./public', d.retailer, d.sku + '.png');
            var imgUrl = properties.get('protocol') + '://' + properties.get('hostname') + ':' + properties
                .get('port') + '/' + d.retailer + '/' + d.sku + '.png';
            await download(d.image_link_1, saveDir, function () {
                // out.images.push(imgUrl);// <-- not here
            });
            out.images.push(imgUrl); // <-- here
        }

        if (d.image_link_2) {
            var saveDir = path.join('./public', d.retailer, d.sku + '_2.png');
            await download(d.image_link_1, saveDir, function () {
                /* var imgUrl = properties.get('protocol') + '://' + properties.get('hostname') + ':' +
                    properties.get('port') + '/' + d.retailer + '/' + d.sku + '_2.png';
                out.images.push(imgUrl); */ // <-- not here
            });
            var imgUrl = properties.get('protocol') + '://' + properties.get('hostname') + ':' +
                properties.get('port') + '/' + d.retailer + '/' + d.sku + '_2.png';
            out.images.push(imgUrl);  // <-- here
        }

        outputArr.push(out);
    }
    console.log(outputArr);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2021-11-29
    • 1970-01-01
    • 2020-11-29
    • 2022-07-07
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多