Javascript coffeescript中带有两个异步函数的promise

Javascript coffeescript中带有两个异步函数的promise,javascript,coffeescript,Javascript,Coffeescript,背景: 我需要调用一个函数(函数a)来发出两次HTTP请求,之后,我需要调用另一个函数(函数B)来计算这两个数组 正常的顺序应该是 (函数A和函数A)异步 当其他两项完成时,功能B 所以我向自己保证,但问题是,我不知道如何正确地语法,我使用Coffeescript 这是我到目前为止得到的,但现在它不起作用 myCoolPromise = () -> return new Promise (resolve, reject) -> postRequest(diagUrl, d

背景:

我需要调用一个函数(函数a)来发出两次HTTP请求,之后,我需要调用另一个函数(函数B)来计算这两个数组

正常的顺序应该是

  • (函数A和函数A)异步
  • 当其他两项完成时,功能B
所以我向自己保证,但问题是,我不知道如何正确地语法,我使用Coffeescript

这是我到目前为止得到的,但现在它不起作用

myCoolPromise = () ->
  return new Promise (resolve, reject) ->
  postRequest(diagUrl, diagnosisBody, storesConnectionObject)
  postRequest(storesUrl, brandBody, storesObject)
  success = true
  if success
    resolve 'stuff worked'
  else
    reject Error 'it broke'


myCoolPromise(storesObject.storesArray, storesConnectionObject.storesArray, absentObject).then (response) ->
  console.log 'success', response
  handleResult(storesObject.storesArray, storesConnectionObject.storesArray, absentObject)
.catch (error) ->
  console.error 'failed', error

这段代码有很多问题,所以我将逐一讨论

首先,您使用以下代码调用函数:

myCoolPromise(storesObject.storesArray, storesConnectionObject.storesArray, absentObject).then (response) ->
为了使其工作,您的
myCoolPromise
方法需要接受3个参数(现在需要0)

其次,在Coffeescript中,
新承诺
行后面的缩进是绝对必要的。现在你有这个:

  return new Promise (resolve, reject) ->
  postRequest(diagUrl, diagnosisBody, storesConnectionObject)
因为下面的行没有缩进,所以第一行之后的任何内容都不被视为承诺的一部分,并且您的
mycolpromise
方法返回一个空承诺


现在,最后讨论承诺的内容(异步调用本身)。您还没有说明如何定义
postRequest
,但是您调用它的方式似乎并不异步。请记住,除了ES7
await
、promissions和占用cpu的循环之外,Javascript支持异步的唯一方式是calbacks。因此,如果
postRequest
有一个回调api,您可以使用incovation提供回调,并在回调体内部调用
resolve
reject
。另一方面,如果
postRequest
提供了一个promise api,那么您可以链接
。然后->解析(“成功”)
,这样的我会回答我自己的问题,在StackOverflow中保持跟踪

我的问题是语法方面

我更改了
postRequest
以返回一个承诺,如果请求返回状态码200,则解决问题,如果返回错误,则拒绝,并将这两个函数链接到一个承诺中,如下所示:

  myCoolPromise = (diagUrl, diagnosisBody, storesUrl, brandBody) ->
    return new Promise (resolve, reject) ->
      postRequest(diagUrl, diagnosisBody)
        .then (storesConnectionObject) ->
          postRequest(storesUrl, brandBody)
            .then (storesObject) ->
              resolve handleResult(storesObject, storesConnectionObject)
            .catch (error1) ->
              reject error1
        .catch (error2) ->
          reject error2

我仍然愿意找到更好的方法来解决这个问题,谢谢

我的
postRequest
函数的结构是这样的
postRequest=(postrl,postBody,postArray)->
我不明白为什么
handleresult
现在仍然是先触发的,调用3个函数的顺序与没有承诺时相同,和console.log“stuff worked”未显示,例如避免!只是
返回承诺。all(postRequest(…),postRequest(…)]。然后(handleResult)
?我不明白
myColPromise
应该做什么。它看起来根本不是异步的,
成功
总是正确的,所以你不应该在这里使用承诺?