承诺在coffeescript中有两个异步函数

时间:2017-06-20 07:53:53

标签: javascript coffeescript

上下文:

我需要调用一个函数(函数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

2 个答案:

答案 0 :(得分:0)

我回答我自己的问题,以便在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

我仍然愿意接受更好的解决方法,谢谢

答案 1 :(得分:-1)

此代码存在许多问题,因此我将逐一介绍。

首先,您使用此代码调用该函数:

myCoolPromise(storesObject.storesArray, storesConnectionObject.storesArray, absentObject).then (response) ->

为了使其正常工作,您的myCoolPromise方法需要采用3个参数(现在它需要0)。

其次,在Coffeescript中,new Promise行之后的缩进是绝对必要的。现在你有这个:

  return new Promise (resolve, reject) ->
  postRequest(diagUrl, diagnosisBody, storesConnectionObject)

由于以下行没有缩进,因此第一行之后的任何内容都被视为承诺的一部分,并且您的myCoolPromise方法返回空承诺。

现在最后,转到promise的内容(异步调用本身)。您还没有显示postRequest的定义方式,但是您调用它的方式似乎并不是异步。请记住,除了ES7 await,promises和cpu-hogging循环之外,Javascript支持异步的唯一方法是calbacks。因此,如果postRequest有一个回调api,你提供一个带有incovation的回调,并在回调体内,调用resolvereject。另一方面,如果postRequest提供了承诺api,您可以链接.then -> resolve("success")