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)
}