我有两个功能:
第一个创建一个http帖子来获取一个xml字符串
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请求并获取一个xml字符串,然后将其转换为一个对象,哪一个是正确的,为什么:
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
})
答案 0 :(得分:4)
您可以通过以下方式构建具有上述功能的承诺链:
post(url, formData)
.then(xmlToObject)
.then(doSomeWork);
function doSomeWork(obj) {
//do some work
}
答案 1 :(得分:4)
ThreadLocal
毫无意义,只能由promise.then(function(obj) {
return obj
})
替换(省略promise
来电)。
then
是您的收藏集中唯一不起作用的。如果您没有….then(function(xml) {
xmlToObject(xml)
// ^ note the missing `return`
}).then(function(obj) {
…
});
任何事情,则无法等待任何事情(并且无法获得任何结果),并且将使用return
立即调用链中的下一个回调。
undefined
这确实有效,但很麻烦。你会得到厄运的缩进金字塔,而忽略post(url, formData).then(function(xml) {
xmlToObject(xml).then(function(obj) {
// do some work
})
})
来自return
回调的任何东西你都无法将任何东西链接到外部的承诺。这对于处理链末端的错误尤为重要。
因此链接承诺的正确方法是
then
完全等同于较短的
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
进行一些工作,nesting(obj
!)是an option out of many。
答案 2 :(得分:0)
这个是正确的
post(url, formData).then( function (xml) {
return xmlToObject(xml)
}).then( function (obj) {
// do some work
});
原因:
当在promise解析器中返回promise时,你可以继续添加.then handler.Maybe promise旨在使用此功能来避免回调地狱
答案 3 :(得分:0)
我更喜欢明确链接这个变体:
return Promise.resolve()
.then(function () {
return post(url, formData);
})
.then(function (xml) {
return xmlToObject(xml);
})
.then(function (object) {
return something;
});