Эквивалентность между двумя разными цепочками поставщиков динамических обещаний

как @balki:

Метод _asdict() можно использовать, если вы запрашиваете определенное поле, потому что оно возвращается как KeyedTuple .

In [1]: foo = db.session.query(Topic.name).first()
In [2]: foo._asdict()
Out[2]: {'name': u'blah'}

Принимая во внимание, что если вы не укажете столбец, вы можете использовать один из других предлагаемых методов - например, тот, который предоставляется @charlax. Обратите внимание, что этот метод действителен только для 2.7 +.

In [1]: foo = db.session.query(Topic).first()
In [2]: {x.name: getattr(foo, x.name) for x in foo.__table__.columns}
Out[2]: {'name': u'blah'}

0
задан Olegzandr Denman 13 July 2018 в 05:12
поделиться

1 ответ

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

Разница:

  • При использовании 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(()=>{});

2
ответ дан dasfdsa 17 August 2018 в 13:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: