2017-06-20 56 views
1

上下文2个异步函数:承诺与CoffeeScript的

我需要调用一个函数(函数A)来进行HTTP请求两个时间,在此之后,我需要调用另一个fonction(函数B),其计算两个阵列

正常顺序应该是

  • (功能A &函数A)异步
  • 当2-其它完成后,功能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 
+0

我不明白'myCoolPromise'应该做什么。它似乎不是异步的,“成功”永远是真的,所以你不应该在这里使用promise? – Bergi

回答

-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方法返回一个空的承诺。

现在最后,到承诺的内容(异步调用本身)。您尚未显示如何定义postRequest,但您调用它的方式似乎不是异步。请记住,除了ES7 await,promises和cpu-hogging循环,Javascript支持异步的唯一方式是回调。因此,如果postRequest有一个回调API,则您在回调体内提供回调并调用resolvereject。在另一方面,如果postRequest提供承诺的API,你可以在.then -> resolve("success")和这样

+0

我'postRequest'功能的结构是这样 'postRequest =(postUrl,postBody,postArray) - >' 我不明白为什么'handleresult'仍然触发第一 目前,3个功能调用但以相同的顺序比没有诺言,并且console.log'东西工作'不示例为 –

0

链我回答我的问题,以保持一丝的StackOverflow

我的问题是语法侧

我改变postRequest返回一个承诺,解决如果请求得到回来的StatusCode 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 

我还是开出了更好的方式来解决这个,谢谢

+0

避免['Promise'构造函数反模式](https://stackoverflow.com/q/23803743/1048572?Whatis -the-承诺建设,反模式和如何对避免-吧)! – Bergi

+1

只需'返回Promise.all(postRequest(...),postRequest(...)]。然后(handleResult)'? – Bergi