一个接一个地解决承诺

时间:2018-08-19 23:43:30

标签: javascript es6-promise

我已经找到了很多解决方案,通常是类似

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()吗?

2 个答案:

答案 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 })

打字稿注释是为了便于阅读。