Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解决导致错误的承诺_Javascript_Arrays_Vue.js_Promise_Sequence - Fatal编程技术网

Javascript 解决导致错误的承诺

Javascript 解决导致错误的承诺,javascript,arrays,vue.js,promise,sequence,Javascript,Arrays,Vue.js,Promise,Sequence,我一直在尝试循环通过一个ID数组,并将它们传递到一个调用API的函数(this.handleTransfer)中。我希望下一次迭代只在收到上一次迭代的响应时启动。 我决定用谷歌搜索如何使用承诺来做到这一点。 但是,当我实现我在网上得到的东西时,在第一次迭代之后出现了以下错误: TypeError: e(...).then is not a function. 源代码是这段代码中的错误 return e().then(Array.prototype.concat.bind(t)) 我的代码如

我一直在尝试循环通过一个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框架。

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

  • 首先,从您使用的
    。。。然后(result=>func()。然后…
    我假设
    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

这个。HandletTransfer(payment)
不会返回承诺?那么async await呢?它将更容易构建您的序列,
。然后(res=>[…result,res])
比该函数可读性更强binding@JonasWilms谢谢你指出这一点。很明显,这是手转帐(付款)我接受了你的承诺,因为你给了我另一种方法来解决我的问题。谢谢你,伙计。。