Раскадровки Xcode теперь показывают только контуры

Нет. Они не одинаковы.

Разница:

  • При использовании async await с for-loop следует помнить, что для цикла идет к следующей итерации только тогда, когда ожидаемое обещание было разрешено в текущей итерации.
  • С другой стороны, когда .then используется в for-loop, это for-loop не ждет обещание разрешить, прежде чем перейти к следующей итерации.

Я изменил ваш код, чтобы продемонстрировать это. Обратите внимание, что в каждом фрагменте кода вызывается линия A в разное время.

Async await внутри кода for-loop:

function createPromiseWhichResolveAfterOneSec(i) {
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            console.log("About to resolve promise with value:",i);//Line A
            resolve(i);
        },1000)
    })
}

const executePromises = async function(listOfProviders) {

    let p;
    let i;
    for(i = 0; i < listOfProviders.length; i++){
        console.log("before", i);
        p = await createPromiseWhichResolveAfterOneSec(i);
        console.log("after", i);
    }
    console.log(i);
    return p;

};


let listOfProviders = [1,2,3,4,5];
let promise = executePromises(listOfProviders);
promise.then(value => console.log("this is the final value of promise chain:",value)).catch(()=>{});

С then в for-loop:

function createPromiseWhichResolveAfterOneSec(i) {
    return new Promise((resolve, reject)=>{
        setTimeout(()=>{
            console.log("About to resolve promise with value:",i);//Line A
            resolve(i);
        },1000)
    })
}


const executePromises = function(listOfProviders){

    let p = Promise.resolve(null);

    for(let i = 0; i < listOfProviders.length; i++){
        console.log("before", i);
        p = p.then(v => createPromiseWhichResolveAfterOneSec(i));
        console.log("after", i);
    }

    return p;

};

let listOfProviders = [1,2,3,4,5];
let promise = executePromises(listOfProviders);
promise.then(value => console.log("this is the final value of promise chain:",value)).catch(()=>{});

0
задан diogenes 20 January 2019 в 06:19
поделиться