我可以在参数中使用承诺吗?
我有两个function:
第一个使一个http post来获得一个xmlstring
function post(url, formData) { return new Promise(function (resolve, reject) { // make an http post and get results (xml string) request(url, formData, function(error, xml) { if (error) reject(error) resolve(xml) }) }) }
把xml转换成一个对象
function xmlToObject(xml) { return new Promise( function (resolve, reject) { // transform xml string to an object using xml2js for example xml2js(xml, function(error, obj) { if (error) reject(error) resolve(obj) }) }) }
现在我想调用post请求并获得一个xmlstring,然后将其转换为一个对象,所以哪一个是正确的,为什么:
post(url, formData).then( function (xml) { xmlToObject(xml).then( function (obj) { // do some work }) })
要么
post(url, formData).then( function (xml) { xmlToObject(xml).then( function (obj) { return obj }) }).then( function (obj) { // do some work })
要么
post(url, formData).then( function (xml) { return xmlToObject(xml) }).then( function (obj) { // do some work })
要么
post(url, formData).then( xmlToObject ) .then( function (obj) { // do some work })
promise.then(function(obj) { return obj })
是毫无意义的,应该由promise
替代(省略then
呼吁)。
….then(function(xml) { xmlToObject(xml) // ^ note the missing `return` }).then(function(obj) { … });
是你的collections中唯一不起作用的 。 如果你没有return
任何东西,就没有任何东西可以等待(没有结果),并且链中的下一个callback将被立即调用。
post(url, formData).then(function(xml) { xmlToObject(xml).then(function(obj) { // do some work }) })
这确实有效,但是很麻烦。 你会得到厄运的缩进金字塔,并且由于忽略了从callback中return
任何东西,你不可能将任何东西链接到外部的承诺上。 这对于处理链条末尾的错误尤为重要。
因此,链接承诺的正确方式是
post(url, formData).then(function(xml) { return xmlToObject(xml); }).then(function (obj) { // do some work })
这相当于更短
post(url, formData).then(xmlToObject).then(function(obj) { // do some work });
如果你想使用xml
和obj
来做一些工作, 嵌套 (使用return
!)是许多选项中的一个 。
您可以通过以下方式构build具有上述function的承诺链:
post(url, formData) .then(xmlToObject) .then(doSomeWork); function doSomeWork(obj) { //do some work }
这一个是正确的
post(url, formData).then( function (xml) { return xmlToObject(xml) }).then( function (obj) { // do some work });
原因:
当在promiseparsing器中返回一个promise时,你可以继续添加.then处理程序。也许诺言是devise用这个特性来避免callback的地狱
我更喜欢清楚地链接这个变体:
return Promise.resolve() .then(function () { return post(url, formData); }) .then(function (xml) { return xmlToObject(xml); }) .then(function (object) { return something; });