Asynchronous 承诺。一切都不会等到。然后()

Asynchronous 承诺。一切都不会等到。然后(),asynchronous,promise,Asynchronous,Promise,我对使用Promise.all有问题。如果我理解正确-someArrayUpdate1异步解析对数组(someArray1)的几个承诺-那么当Promise.all(someArray1)命中时,它迟早会拥有所有数据。同样的事情也发生在someArrayUpdate2上——因此它立即开始构建数据(someArray2) 我认为.then()将像制动器一样工作,所以Promise.all(someArray2)将在Promise.all(someArray1)之后开始构建promises数组。由于

我对使用Promise.all有问题。如果我理解正确-someArrayUpdate1异步解析对数组(someArray1)的几个承诺-那么当Promise.all(someArray1)命中时,它迟早会拥有所有数据。同样的事情也发生在someArrayUpdate2上——因此它立即开始构建数据(someArray2)

我认为.then()将像制动器一样工作,所以Promise.all(someArray2)将在Promise.all(someArray1)之后开始构建promises数组。由于TEST1(mainArray)对象状态将被启用

现在的问题是TEST1(mainArray)对象状态为OFF。我不知道如何改变这一点。有什么想法吗

<doctype>
<html>
<head>
    <title>TEST</title>
</head>
<body>

<img src="img1.jpg" />
<img src="img2.jpg" />
<img src="img3.jpg" />

<script>

    // ARRAYS and FUNCTIONS:
    var mainArray = [{
        TEST1 : {
            status : ''
        },
        TEST2 : {
            status : ''
        },
        TEST3 : {
            status : ''
        }
    }];

    var someArray1 = []; // for imgs
    var someArray2 = []; // for objects

    function someArray1Update(imgSrc, imgCounter) {
        return new Promise(function (resolve, reject) {
            setTimeout(function() {// - for marking asynchronous data flow

                    // this is where the problem is (lets assume that this code must be placed here) - we update second array here for Promise.all(someArray2) but nothing happen... status is OFF
                    someArray2.push(someArray2Update('TEST1', 'on'));

                    return resolve({counter : imgCounter, url : imgSrc});
            }, 1000);
        });
    }

    function someArray2Update(object, status) {
        return new Promise(function(resolve, reject) {
            return resolve({
                [object] : {
                    status : status,
                }
            });
        });
    }

    // CODE:
    someArray2.push(someArray2Update('TEST2', 'on')); // working fine

    var imgs = document.images || document.getElementsByTagName('img');
    var imgsLength = imgs.length;
    var imgSrc = '';
    var imgsInfo = '';

    if (imgsLength !== 0) {
        for (var i = 0; i < imgsLength; i++) {
            imgSrc = imgs[i].getAttribute('src');

            var imgCounter = i + 1;

            someArray1.push(someArray1Update(imgSrc, imgCounter));

            console.log('Image ' + [i + 1] + ' - ' +  imgSrc);
            imgsInfo  += 'Image ' + [i + 1] + ' - ' +  imgSrc + '<br />';
        }
    }
    else;

    someArray2.push(someArray2Update('TEST3', 'on')); // working fine

    Promise.all(someArray1).then(function(all) {
        console.log('\n');
        all.forEach(function(i) {
            console.log('someArray1 - ok');
        });
        console.log('\n');
    }).then(Promise.all(someArray2).then(function(array) {
            array.forEach(function(i) {
                mainArray[0] = Object.assign(mainArray[0], i);
            });
            console.log('\n=========================================================');
            console.log(mainArray);
            console.log('=========================================================\n');
        }));

</script>


</body>
</html>

测验
//数组和函数:
变量mainArray=[{
测试1:{
状态:“”
},
测试2:{
状态:“”
},
测试3:{
状态:“”
}
}];
var someArray1=[];//对于imgs
var someArray2=[];//对于对象
函数someArray1Update(imgSrc、imgCounter){
返回新承诺(功能(解决、拒绝){
setTimeout(函数(){//-用于标记异步数据流
//这就是问题所在(假设此代码必须放在这里)-我们更新此处的第二个数组以获得承诺。全部(someArray2)但什么都没有发生…状态为关闭
push(someArray2Update('TEST1','on');
返回解析({counter:imgCounter,url:imgSrc});
}, 1000);
});
}
函数someArray2Update(对象、状态){
返回新承诺(功能(解决、拒绝){
返回解析({
[对象]:{
状态:状态,
}
});
});
}
//代码:
someArray2.push(someArray2Update('TEST2','on'));//工作正常
var imgs=document.images | | document.getElementsByTagName('img');
var imgsLength=imgs.length;
var imgSrc=“”;
var imgsInfo=“”;
如果(imgsLength!==0){
对于(变量i=0;i;
}
}
其他的
someArray2.push(someArray2Update('TEST3','on'));//工作正常
承诺。全部(某物1)。然后(功能(全部){
console.log('\n');
all.forEach(功能(i){
log('someArray1-ok');
});
console.log('\n');
}).then(Promise.all(someArray2).then(function(array){
array.forEach(函数(i){
mainArray[0]=Object.assign(mainArray[0],i);
});
console.log('\n==============================================================================================================================');
console.log(mainArray);
console.log('========================================================================================\n');
}));
这应该是这样的:

).then(*function()*{Promise.all(someArray2).then(function(array) {
            array.forEach(function(i) {
                mainArray[0] = Object.assign(mainArray[0], i);
            });
            }console.log('\n=========================================================');
            console.log(mainArray);
            console.log('=========================================================\n');
        }));

感谢@Bergi指出这一点。

您必须将回调函数传递给
然后
,而不是
Promise.all(someArray2)的结果。然后(…)
老实说,我不知道它应该是什么样子(以异步方式,代码中有许多someArray2Update函数。你能带个例子吗?谢谢。你已经用
做得很好了。然后(function(all){…})
。哦,我明白了……这是一个代码错误,谢谢你指出@Bergi。你还需要从回调中删除它,这样你就可以。
).then(*function()*{Promise.all(someArray2).then(function(array) {
            array.forEach(function(i) {
                mainArray[0] = Object.assign(mainArray[0], i);
            });
            }console.log('\n=========================================================');
            console.log(mainArray);
            console.log('=========================================================\n');
        }));