написать время l oop, используя обещания, используя возвращаемые значения в следующем обещании - PullRequest
3 голосов
/ 09 января 2020

Я прочитал все вопросы по этой теме на SO, но я все еще застрял, потому что функция condition в promiseWhile не принимает параметр.

Мой пример использования следующий. Я пытаюсь запросить некоторую информацию на определенную дату (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_promise вернуть обещание.

В моем состоянии promiseWhile я пытаюсь проверить, что body.rows содержит что-то, где body является параметром функции .then после разрешения результата date_promise. (date_promise(some_date).then((body) => {...})).

Я не уверен, что делать дальше. Любая помощь приветствуется.

1 Ответ

3 голосов
/ 09 января 2020

Promise.method является более старой версией asyn c 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
});
...