我已经找到了很多解决方案,通常是类似
const serial = funcs =>
funcs.reduce((promise, func) =>
promise.then(result =>
func().then(Array.prototype.concat.bind(result))),
Promise.resolve([])
)
我正在尝试映射一个承诺数组并一个接一个地运行它们,
serial(Object.keys(tables).map(key =>
websocketExecute(store,dropTableSQL(tables[key]),null)))
.then(data => {console.log(data);success(data)})
它们全部运行,但是我收到错误消息TypeError: func is not a function
然后决赛没有解决。
有人知道我如何在承诺列表上运行final .then()吗?
答案 0 :(得分:1)
您的函数serial
期望其参数为返回Promises的函数数组
但是
Object.keys(tables).map(key => websocketExecute(store,dropTableSQL(tables[key]),null))
返回调用结果的数组
websocketExecute(store,dropTableSQL(tables[key]),null)
不太可能是返回承诺的函数,更像是一些结果
您想要做的是:
serial(Object.keys(tables).map(key => () => websocketExecute(store,dropTableSQL(tables[key]),null)))
.then(data => {console.log(data);success(data)})
假设websocketExecute
返回一个承诺
现在,.map
返回的数组是
() => websocketExecute(store,dropTableSQL(tables[key]),null)
将在.reduce
中依次呼叫哪个人
答案 1 :(得分:-1)
也请检出Promise.all()。
如果我没记错的话,您应该可以执行以下操作:
const promises: Promise<any>[] = Object.keys(tables).map(key => (
websocketExecute(store, dropTableSQL(tables[key]), null)
)
Promise.all(promises).then((results: any[]) => { ...do stuff })
打字稿注释是为了便于阅读。