javascript - 在 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 数组的顺序相同?
解决方案
推荐阅读
- java - 流入 orElse 的可选
- python - Python中的MD5哈希
- database - 写入 SQL 数据库 - ConnectionException - PySpark
- javascript - 带有字符串索引和.push()的Javascript 1D和2D数组?
- python - 如何在 Tensorflow 中打印出预测概率
- sql - 如何使用 DataGrip 在本地创建 postgre SQL 数据库
- hdfs - 使用 GDAL 在 HDFS 中打开栅格
- tfs - 升级到 SonarQube 6.7.5 后,在 TFS 2017 构建定义中运行 SonarQube 的代码分析任务失败
- loops - SSIS - 使用顶部处理批次
- ios - 在 UIStackView 中增加 UIButton 的面积