Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在数组中用已实现的值替换承诺项_Javascript_Arrays_For Loop_Promise_Es6 Promise - Fatal编程技术网

Javascript 在数组中用已实现的值替换承诺项

Javascript 在数组中用已实现的值替换承诺项,javascript,arrays,for-loop,promise,es6-promise,Javascript,Arrays,For Loop,Promise,Es6 Promise,以下是我将用作参考的代码示例 var promises = []; for (var i = 0; i < arrayCars.length; i++) { promises.push(downloadSpecs({ // function downloadSpecs returns a promise which later resolves a JSON model: arrayCars[i] })); } Promise.all(promises).then(fun

以下是我将用作参考的代码示例

var promises = [];
for (var i = 0; i < arrayCars.length; i++) {
  promises.push(downloadSpecs({ // function downloadSpecs returns a promise which later resolves a JSON
    model: arrayCars[i]
  }));
}

Promise.all(promises).then(function(output) {
  for (var i = 0; i < output.length; i++) {

    var preownedMiles = output[i].preownedMiles;
    var zipRadius = output[i].zipcodeRadius;

    if ('discount' in output[i]) {

      featuredCars.models.push({
        "name": output[i].modelName,
        "type": output[i].bodyType,
        "value": output[i].salePrice,
        "photos": []
      });

    }

    if (preownedMiles > 10000) {

      featuredCars.models.push({
        "name": output[i].modelName,
        "type": output[i].bodyType,
        "value": output[i].salePrice - 3000,
        "photos": []
      });

      featuredCars.models.photos[featuredCars.models.photos.length - 1].push(downloadImg({ // function downloadImg returns a promise which resolves the downloaded path
          urls: output[i].picURLS,
          saveThumbnail: false
        }));
    }

    if (zipRadius < 6) {

      featuredCars.models.push({
        "name": output[i].modelName,
        "type": output[i].bodyType,
        "value": output[i].salePrice - 1000,
        "photos": []
      });
      featuredCars.models.photos[featuredCars.models.photos.length - 1].push(downloadImg({ // function downloadImg returns a promise which resolves the downloaded path
          urls: output[i].picURLS,
          saveThumbnail: false
      }));
    }
  }
}
var承诺=[];
对于(var i=0;i10000){
特性cars.models.push({
“名称”:输出[i].modelName,
“类型”:输出[i]。主体类型,
“价值”:产出[i]。销售价格-3000,
“照片”:[]
});
featuredCars.models.photos[featuredCars.models.photos.length-1].push(downloadImg({//函数downloadImg返回解析下载路径的承诺
URL:output[i].picURL,
保存缩略图:false
}));
}
if(齐普拉迪<6){
特性cars.models.push({
“名称”:输出[i].modelName,
“类型”:输出[i]。主体类型,
“价值”:产出[i]。销售价格-1000,
“照片”:[]
});
featuredCars.models.photos[featuredCars.models.photos.length-1].push(downloadImg({//函数downloadImg返回解析下载路径的承诺
URL:output[i].picURL,
保存缩略图:false
}));
}
}
}
正如您在循环执行后看到的,“promises”数组应该包含一堆promise对象。我在下一个块中使用promise.all()解析了这些对象。然后()。如果您看到,根据某些条件,“featuredCars.models”对象的“photos”键再次设置为promise对象(因为函数“downloadImg”返回一个promise对象)。我无法更改这些函数的行为,因为它们是我正在使用的库的一部分,我无法控制修改它们

所以我正在寻找一种迭代“featuredCars.models”对象和 将“photos”数组的值替换为它们各自承诺对象的已实现值

到目前为止,我一直在尝试使用for循环,我观察到如果我对“featuredCars.models.photos”中的.all()进行承诺,我无法访问循环计数器,因此我可以用“.then()”中承诺的分辨率替换“featuredCars.models.photos”的值

我想我需要以某种方式将循环计数器传递到.then(),以便知道需要替换对象的哪个索引,因为不是每个“photos”数组都包含一个Promise对象


我已经尽力做到尽可能清晰。如果我听起来模棱两可,请耐心听我说。

如果您想在异步操作返回后使用循环计数器变量,您应该使用块作用域变量(
let
const
)或创建一个新的闭包

请参见此处的问题:

for (var i = 0; i < 10; i++) {
    setTimeout(function() { console.log(i) }, 0)
}
结束时:

for (var i = 0; i < 10; i++) {
    (function(iInLoop) {
        setTimeout(function() {
             console.log(iInLoop)
        }, 0)
    })(i)
}
for(变量i=0;i<10;i++){
(功能(iInLoop){
setTimeout(函数(){
控制台日志(iInLoop)
}, 0)
})(一)
}

如果您执行这些操作之一,则可以添加一个
then()
到photo promise,它将根据循环周期中
i
的值更新数组中的值。

如果同一辆车满足所有三个条件,您真的想推三次吗?
功能cars。模型在您的代码中看起来像一个数组。它不应该有
。photos
属性,是吗?
for (var i = 0; i < 10; i++) {
    (function(iInLoop) {
        setTimeout(function() {
             console.log(iInLoop)
        }, 0)
    })(i)
}