Разрешать обещания последовательно, приводя к ошибке - PullRequest
0 голосов
/ 02 мая 2019

Я пытался перебрать массив идентификаторов и передать их в функцию (this.handleTransfer), которая вызывает API.Я хочу, чтобы следующая итерация включалась только тогда, когда получен ответ от предыдущей итерации.Я решил погуглить, как использовать обещания, чтобы сделать это.Но когда я реализовал то, что получил в сети, после первой итерации возникает ошибка ниже:

TypeError: e(...).then is not a function.

Источником ошибки был этот блок кода

return e().then(Array.prototype.concat.bind(t))

Мой код ниже:

const promiseSerial = funcs =>
        funcs.reduce((promise, func) =>
          promise.then(result => func().then(Array.prototype.concat.bind(result))),
          Promise.resolve([]))

        const payments = this.payIDArray;

        const funcs = payments.map(payment => () => this.handleTransfer(payment))

        promiseSerial(funcs)
        .then(console.log.bind(console))
        .catch(console.error.bind(console))

Я использую фреймворк VueJS.

1 Ответ

1 голос
/ 02 мая 2019

Читая пример кода, который вы разместили, я сделал несколько предположений.

  • Во-первых, из вашего использования ... promise.then(result => func().then ... я сделал предположение, что this.handleTransfer(payment) возвращает функцию, а эта функция возвращает обещание.
  • Во-вторых, из-за того, что вы используете конкатенацию, я предполагаю, что данные, отправляемые вашим вызовом API, являются массивом.

Приведенная ниже реализация promiseSerial возвращает цепочку обещаний, которая разрешаетк объединению всех массивов, возвращаемых вызовами this.handleTransfer(payments), с сохранением последовательности вызовов.

const promiseSerial = (funcs) => funcs.reduce((resultPromise, apiPromise) => {
    return resultPromise.then((concatenatedAPIResponses) => {
        const apiCallPromise = apiPromise(); //because this.handleTransfer(payment) returns a function  
        //const apiCallPromise = apiPromise; if this.handleTransfer(payment) returns a promise instead of a function

        return apiCallPromise.then((apiCallResponse) => {
            concatenatedAPIResponses = concatenatedAPIResponses.concat(apiCallResponse)
            return concatenatedAPIResponses
        })
    })
}, Promise.resolve([]))

Codepen здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...