Я написал много скриптов-бенчмарков в Node.js для разного дизайна схемы redis. Я попытался запустить все тестовые функции в порядке последовательности. Я наткнулся на множество асинхронных шаблонов в StackOverflow, чтобы решить эту проблему. Эти шаблоны отлично работают при простой асинхронности, но моя единственная функция бенчмарка содержала много вложенных асинхронных функций, и, когда я использовал эти шаблоны, вложенные асинхронные функции выполнялись по порядку, но весь бенчмарк параллельно. Вот пример:
Результат одного теста выглядит следующим образом: Один тест
Когда я запускаю все тесты с шаблоном Promise: Многие тесты
Функция эталона выглядит следующим образом. Другие имеют такую же структуру:
async function CMbenchmark(redis,size,flag){
var time_stamp0;
var time_stamp1;
var time_stamp2;
redis.flushall().then(()=>{
//initialize data
time_stamp0 = performance.now();
console.log("benchmark size: "+size);
CMinitializeFakeData(redis,size)
}).then(()=>{
time_stamp1 = performance.now();
console.log("time for initialize data: "+size);
console.log(time_stamp1-time_stamp0);
searchEntryByBM(redis,"gender","male");
}).then(()=>{
time_stamp2 = performance.now();
console.log("time for search operation: ");
console.log(time_stamp2-time_stamp1);
redis.memory("stats").then(function(result){
console.log(result[0]+": "+result[1]/1000000+"MB");
console.log(result[2]+": "+result[3]/1000000+"MB");
});
});
}
Некоторые выполняемые мной функции выполнения, многие другие варианты выглядят аналогично:
async function benchAll(){
Promise.resolve(benchmark2(redis,size,0)).then(function(){
return Promise.resolve(benchmark(redis,size,0));
}).then(function(){
return Promise.resolve(CMbenchmark(redis,size,0));
});
}
async function benchAll2(){
const result1 = await benchmark(redis,size,0);
const result2 = await benchmark2(redis,size,0);
const result3 = await CMbenchmark(redis,size,0);
}
в отношении: Как мне вызвать 3 функции по порядкувыполнить их один за другим? . Цепочка обратного вызова также не работает. Кроме поиска решения. Я также ищу объяснение того, почему цепочка обратных вызовов работает на простой асинхронной, но не вложенной асинхронной.
update:
После добавления возврата к обещанию в соответствии с ответом @ d-_-б, проблема все еще существует.