首页 > 解决方案 > 在 Promise.all 中保持 Promise 数组的顺序

问题描述

我对 promise all 和由此产生的订单有疑问。作为我使用的示例:

async function getControlFile(testcases, timeout, uptimeout){


    //2.) Löschen der Testcafe Steuerungsdatei zum neu Schreiben.
    fs.unlinkSync(__basedir + '/tests/temp.js');

    //3.) Öffen des Streams zum Schreiben der Steuerungsdatei
    var logger = fs.createWriteStream(__basedir + '/tests/temp.js', {
        flags: 'a' // 'a' means appending (old data will be preserved)
    });

    //Zuerst den Header schreiben.
    //Wir schreiben den Login/Pass einmal hinzu.
    logger.write('import { Selector, Role } from \'testcafe\';'+'\n');
    logger.write('import inputStore from \'../config/input-store\';'+'\n\n');

    //Tester Rolle Schreiben damit wir nicht immer neu einloggen müssen.
    logger.write('const bc3Tester = Role(inputStore.metaUrl, async t => {'+'\n');
    logger.write('await t'+'\n');
    logger.write('   .typeText(Selector(\'#email\'), inputStore.clLogin, {'+'\n');
    logger.write('      caretPos: 0'+'\n');
    logger.write('   })'+'\n');
    logger.write('   .typeText(Selector(\'#password\'), inputStore.clPassword, {'+'\n');
    logger.write('       caretPos: 0'+'\n');
    logger.write('   })'+'\n');
    logger.write('   .click(Selector(\'span\').withText(\'Login\'))'+'\n');
    logger.write('}, { preserveUrl: true });'+'\n\n');

    //4.) Fixture Datum festlegen.
    var today = new Date();
    var date = today.getDate()+'-'+(today.getMonth()+1)+'-'+today.getFullYear()+' ('+today.getHours() + ':' + today.getMinutes() + ':' + today.getSeconds()+')';
    var xTransformDate = today.getDate()+'_'+(today.getMonth()+1)+'_'+today.getFullYear()+'_'+today.getHours() + '_' + today.getMinutes() + '_' + today.getSeconds();


    logger.write('fixture `Clipcafe Run '+date+'`'+'\n\n');

    //HERE IT STARTS
    //The testcases array is an array of MongoDB __id to select them.
    //I do not know the amount of testcases. 
    await Promise.all(testcases.map(async (entryMain) => {
        await getTestData(entryMain, logger, timeout, uptimeout, xTransformDate);

    })).catch(function(err) {
        console.log("Fehler beim Schreiben des Testscripts.");
        return;
    });


    console.log("logger end");
    // Fixture Schliessen
    logger.end();  // close string


该脚本将准备一个文件,我使用一个 Promise all,映射到一个 MongDB __id 数组来创建 Promise。

async function getTestData(id, klogger, timeout, uptimeout, dateString){

    return new Promise((resolve, reject) => {

        Case.findById(id, function(err, tCase) {

            if (err)
                reject(err);


            var tempData = tCase.data;

            //Replace timeouts
            tempData = tempData.replace(/%%TIMEOUT%%/g,timeout);
            tempData = tempData.replace(/%%UPLOAD%%/g,uptimeout);

            tempData = tempData.replace(/%%FOLDER1%%/g,"testfolder1"+dateString);
            tempData = tempData.replace(/%%FOLDER2%%/g,"testfolder2"+dateString);

            tempData = tempData.replace(/%%IMAGE1%%/g,"testimage1"+dateString);
            tempData = tempData.replace(/%%IMAGE2%%/g,"testimage2"+dateString);

            tempData = tempData.replace(/%%IMAGE3%%/g,"testrenamed"+dateString);

            //Ende Jury Fixure

            klogger.write(tempData + '\n');


            klogger.write('\n\n');


            resolve('true');

        });

    });
};

我现在的问题是,文件内的顺序不是给定数组的顺序。该顺序基于 Mongo 请求所需的时间。

我读到,最终的顺序总是输入的顺序,但我也读到 promise.all 的承诺是异步工作的。

那么我怎样才能做到,文件中的最终顺序与输入 Mongo __id 数组的顺序相同?

标签: javascriptnode.jsmongodb

解决方案


推荐阅读