Promise не работает на Node.js, вложенном в Async - PullRequest
0 голосов
/ 09 октября 2019

Я написал много скриптов-бенчмарков в 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-_-б, проблема все еще существует.

1 Ответ

2 голосов
/ 09 октября 2019

Вам нужно return обещание, которое вы хотите получить в следующем .then().

Вы очень близки! каждый раз, когда вы звоните .then(function(){...}), вы должны возвращать какое-то значение, чтобы следующее .then() получало его.

redis.flushall().then(()=>{
  //initialize data
  time_stamp0 = performance.now();
  console.log("benchmark size: "+size);
  return CMinitializeFakeData(redis,size)// <-- added return here
}).then(()=>{
  time_stamp1 = performance.now();
  console.log("time for initialize data: "+size);
  console.log(time_stamp1-time_stamp0);
  return searchEntryByBM(redis,"gender","male"); // <-- added return here
}).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");
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...