上下文:
我需要调用一个函数(函数A)来做两次HTTP请求,在此之后,我需要调用另一个计算两个数组的函数(函数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 :(得分: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的回调,并在回调体内,调用resolve
或reject
。另一方面,如果postRequest
提供了承诺api,您可以链接.then -> resolve("success")
等