按顺序解决承诺导致错误
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
我一直在尝试遍历 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