2017-06-20 79 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