按顺序解决承诺导致错误

Resolve promises sequentially resulting in error

我一直在尝试遍历 ID 数组并将它们传递给调用 API 的函数 (this.handleTransfer)。我希望下一次迭代仅在收到前一次迭代的响应时才启动。 我决定 google 如何使用承诺来做到这一点。 但是当我实现我在网上得到的东西时,第一次迭代后出现以下错误:

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 框架。

阅读您发布的示例代码后,我做出了一些假设。

  • 首先,来自您对 ... promise.then(result => func().then ... 的使用 我假设 this.handleTransfer(payment) returns a 函数,而那个函数 returns 是一个承诺。
  • 其次,来自您的使用 串联,我假设您的 API 调用发回的数据是 数组。

promiseSerial 下面的实现 returns 承诺链解析为 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 here