【问题标题】:Resolve promises sequentially resulting in error按顺序解决承诺导致错误
【发布时间】:2019-05-02 22:39:13
【问题描述】:

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

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

【问题讨论】:

  • this.handleTransfer(payment) 不返回承诺?
  • 异步等待呢?构建您的序列会容易得多
  • .then(res => [...result, res]) 比函数绑定更具可读性
  • @JonasWilms 感谢您指出这一点。显然 this.handleTransfer(payment) 正在返回任何承诺......

标签: javascript arrays vue.js promise sequence


【解决方案1】:

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

  • 首先,从您使用... 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([]))

代码笔here

【讨论】:

  • 我接受这个是因为你给了我另一种方法来解决我的问题。谢谢老兄..
猜你喜欢
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 2019-10-23
  • 1970-01-01
  • 2021-12-07
相关资源
最近更新 更多