Как я могу запустить другую функцию после if-else в возвращаемом Promise? - PullRequest
0 голосов
/ 21 мая 2018

У меня есть логика, пытающаяся запустить rp (запрос-обещание) после if-else в then процессе возврата Promise.Исходя из моего предположения, я думал, что процесс должен пройти шаги с 1 по 10 (некоторые части могут повторяться и увеличивать ценность).И после завершения solveProblem, наконец, он переходит к doOther().

Ниже приведена упрощенная версия моих кодов, хотя она немного запутанная:

const request = require("request");
const rp = require("request-promise");
let url = "http://localhost:3000/";

let sendResult = c => {
  console.log("step 4", c);
  return new Promise((resolve, reject) => {
    if (c < 5) {
      console.log("step 5 resolve(true)", c);
      resolve(true);
    } else {
      console.log("step 5 resolve(false)", c);
      resolve(false);
    }
  });
};

let repeat = (a, b) => {
  c = a + b;
  console.log("step 3", c);
  return sendResult(c).then(result => {
    console.log("step 6", result);
    if (!result) {
      console.log("step 7");
      rp(url).then(data => {
        console.log("step 8");
        let d = c + 1;
        if (d < 7) {
          console.log("step 9", d);
          return repeat(d, a);
        } else {
          console.log("step 10", d);
          return "done";
        }
      });
    } else {
      return repeat(c, a);
    }
  });
};

let solveProblem = (a, b) => {
  return new Promise((resolve, reject) => {
    resolve(a + b);
  });
};

let doOther = () => {
  console.log("doOther");
};

let run = (a, b) => {
  console.log("step 1");
  solveProblem(a, b)
    .then(data => {
      console.log("step 2", data);
      return repeat(data, 1);
    })
    .then(() => {
      return doOther();
    });
};

run(1, 1);

Однако,результат не такой, как я ожидаю.Он откладывает rp и сразу прыгает на улицу, затем на doOther().После этого продолжается rp.Например:

step 1
step 2 2
step 3 3
step 4 3
step 5 resolve(true) 3
step 6 true
step 3 5
step 4 5
step 5 resolve(false) 5
step 6 false
step 7
doOther
step 8
step 9 6
step 3 9
step 4 9
step 5 resolve(false) 9
step 6 false
step 7
step 8
step 10 10

Я уверен, что это асинхронная проблема, но я не уверен, как я могу изменить ее, чтобы она соответствовала моим требованиям (шаг 1 ~ 10, затем doOther()).Может ли кто-нибудь помочь мне разобраться?Спасибо.

1 Ответ

0 голосов
/ 21 мая 2018

вам нужно вернуть rp(url), чтобы связать его

...
return rp(url).then(data => {
    console.log("step 8");
    let d = c + 1;
    if (d < 7) {
      console.log("step 9", d);
      return repeat(d, a);
    } else {
      console.log("step 10", d);
      return "done";
    }
  });
...
...