Несоответствие Конда и Пичарм

Вы не очень конкретно относитесь к своему коду, поэтому я создам сценарий. Допустим, у вас 10 вызовов ajax, и вы хотите аккумулировать результаты этих 10 аякс-звонков, а затем, когда они все закончили, вы хотите что-то сделать. Вы можете сделать это так, аккумулируя данные в массиве и отслеживая, когда последний закончен:

Ручной счетчик

var ajaxCallsRemaining = 10;
var returnedData = [];

for (var i = 0; i < 10; i++) {
    doAjax(whatever, function(response) {
        // success handler from the ajax call

        // save response
        returnedData.push(response);

        // see if we're done with the last ajax call
        --ajaxCallsRemaining;
        if (ajaxCallsRemaining <= 0) {
            // all data is here now
            // look through the returnedData and do whatever processing 
            // you want on it right here
        }
    });
}

Примечание: здесь важна обработка ошибок (не показано, потому что это зависит от того, как вы делаете свои айакс-звонки). Вам нужно подумать о том, как вы собираетесь справляться с ситуацией, когда один вызов ajax никогда не завершается, либо с ошибкой, либо застрял в течение длительного времени или времени после долгого времени.


jQuery Promises

Добавление к моему ответу в 2014 году. В наши дни обещания часто используются для решения этой проблемы, поскольку jQuery $.ajax() уже возвращает обещание, а $.when() сообщит вам, когда группа обещаний все решены и собирают результаты возврата для вас:

var promises = [];
for (var i = 0; i < 10; i++) {
    promises.push($.ajax(...));
}
$.when.apply($, promises).then(function() {
    // returned data is in arguments[0][0], arguments[1][0], ... arguments[9][0]
    // you can process it here
}, function() {
    // error occurred
});

Стандартные обещания ES6

Как указано в ответе kba : если у вас есть среда с встроенными встроенными обещаниями (современный браузер или node.js или с использованием babeljs, перетаскивающими или использующими обещание polyfill), тогда вы можете использовать обещания, указанные в ES6. См. эту таблицу для поддержки браузера. Обещания поддерживаются практически во всех текущих браузерах, кроме IE.

Если doAjax() возвращает обещание, вы можете сделать это:

var promises = [];
for (var i = 0; i < 10; i++) {
    promises.push(doAjax(...));
}
Promise.all(promises).then(function() {
    // returned data is in arguments[0], arguments[1], ... arguments[n]
    // you can process it here
}, function(err) {
    // error occurred
});

Если вам нужно чтобы выполнить обезврежденную асинхронную операцию в ту, которая возвращает обещание, вы можете «обещать» это следующим образом:

function doAjax(...) {
    return new Promise(function(resolve, reject) {
        someAsyncOperation(..., function(err, result) {
            if (err) return reject(err);
            resolve(result);
        });
    });
}

И затем используйте шаблон выше:

var promises = [];
for (var i = 0; i < 10; i++) {
    promises.push(doAjax(...));
}
Promise.all(promises).then(function() {
    // returned data is in arguments[0], arguments[1], ... arguments[n]
    // you can process it here
}, function(err) {
    // error occurred
});

Bluebird Promises

Если вы используете библиотеку с большим количеством функций, такую ​​как библиотека обещаний Bluebird , тогда у нее есть некоторые дополнительные функции, чтобы сделать это проще:

 var doAjax = Promise.promisify(someAsync);
 var someData = [...]
 Promise.map(someData, doAjax).then(function(results) {
     // all ajax results here
 }, function(err) {
     // some error here
 });

1
задан Sina 27 February 2019 в 15:48
поделиться

1 ответ

PyCharm показывает вам список установленных пакетов с pip, а conda list показывает и pip, и conda. Между тем, вы можете переключаться между pip и conda с помощью специальной кнопки в PyCharm:

enter image description here

0
ответ дан Pavel Karateev 27 February 2019 в 15:48
поделиться
Другие вопросы по тегам:

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