我可以在参数中使用承诺吗?

我有两个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 }); 

如果你想使用xmlobj来做一些工作, 嵌套 (使用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; });