使用承诺在下一个承诺中使用 return 值编写 while 循环

write a while loop using promises using return values within the next promise

我已经阅读了关于这个主题的所有问题,但我仍然卡住了,因为 promiseWhile 中的 condition 函数没有参数。

我的用例如下。我正在尝试查询某个日期 (start_date) 的一些信息。我不知道我的数据库中是否有 start_date 的信息,所以我想检查一下。如果没有数据,我想在前一天查询并一直这样做,直到有数据为止。 (我知道 promise while loop 不是最好的方法,但我还是想学习如何做)

到目前为止,这是我的代码

let start_date = DateTime.fromFormat(req.body.date, "yyyy-MM-dd");
let date_promise = (the_date) => {
    let the_req = {
        date: the_date
    };
    return db.query(the_req);
};

let promiseWhile = Promise.method(function (condition, action) {
    if (!condition()) return;
    return action().then(promiseWhile.bind(null, condition, action));
});

promiseWhile(
    (body) => {return body.rows.length > 0},
    () => {
        start_date = start_date.minus(luxon.Duration.fromObject({days: 1}))
        return date_promise(start_date);
    },
).then((result) => {
    // start_date ... 
    // do something with the date I've obtained
});

date_promisereturn一个承诺。

在我的 promiseWhile 条件下,我试图测试 body.rows 包含一些东西 body 作为 .then 函数的参数在 [=17 的结果之后=] 解决。 (date_promise(some_date).then((body) => {...})).

我不确定如何从那里继续。欢迎任何帮助。

Promise.method 是 async functions 的旧版本。考虑到这一点并进行一些语法更正,您的代码将如下所示:

let start_date = DateTime.fromFormat(req.body.date, "yyyy-MM-dd");

let date_promise = (the_date) => {
    let the_req = {
        date: the_date
    };
    return db.query(the_req);
};

const myAction = date => () => date_promise(date);

let promiseWhile = async function (condition, action) {
    const queryResults = await action();
    if (!condition(queryResults)) {
      start_date = start_date.minus(luxon.Duration.fromObject({days: 1}));
      return promiseWhile(condition, myAction(start_date));
    } else {
      return queryResults;
    }
};

promiseWhile(
    body => body.rows.length > 0,
    () => {
        return myAction(start_date);
    },
).then(result => { // The result you'll get here is queryResults.
    // start_date ... 
    // do something with the date I've obtained
});