Javascript 我可以在辩论中使用承诺吗?
我有两个功能: 第一个生成一个http post以获取xml字符串Javascript 我可以在辩论中使用承诺吗?,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我有两个功能: 第一个生成一个http post以获取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 (err
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(xmlToObject)
.then(doSomeWork);
function doSomeWork(obj) {
//do some work
}
您可以通过以下方式使用上述功能构建承诺链:
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
});
原因:
在promise resolver中返回承诺时,您可以继续添加。然后添加处理程序。promise可能是为了使用此功能来避免回调地狱这是正确的
post(url, formData).then( function (xml) {
return xmlToObject(xml)
}).then( function (obj) {
// do some work
});
原因:
当在承诺解析程序中返回承诺时,您可以继续添加。然后添加处理程序。可能承诺就是为了使用此功能来避免回调地狱
是没有意义的,应该用promise
替换(省略then
调用)
是您的收藏中唯一不起作用的。如果您不返回
任何内容,则不会等待任何结果(也不会获得任何结果),链中的下一个回调将立即使用未定义的
调用
这确实有效,但很麻烦。你会得到末日的缩进金字塔,如果忽略从然后回调中返回任何内容,你就不可能将任何内容链接到外部承诺。这对于处理链末端的错误尤其重要
因此,链接承诺的正确方式是
这完全等同于较短的
如果您想同时使用xml
和obj
进行一些工作,则可以使用return
!)
是没有意义的,应该用promise
替换(省略then
调用)
是您的收藏中唯一不起作用的。如果您不返回
任何内容,则不会等待任何结果(也不会获得任何结果),链中的下一个回调将立即使用未定义的
调用
这确实有效,但很麻烦。你会得到末日的缩进金字塔,如果忽略从然后回调中返回任何内容,你就不可能将任何内容链接到外部承诺。这对于处理链末端的错误尤其重要
因此,链接承诺的正确方式是
这完全等同于较短的
如果您想同时使用xml
和obj
,(使用return
!)进行一些工作,则是。我更喜欢使用此变量的清晰链接:
return Promise.resolve()
.then(function () {
return post(url, formData);
})
.then(function (xml) {
return xmlToObject(xml);
})
.then(function (object) {
return something;
});
我更喜欢清晰链接此变体:
return Promise.resolve()
.then(function () {
return post(url, formData);
})
.then(function (xml) {
return xmlToObject(xml);
})
.then(function (object) {
return something;
});
js是灵活的。做某事的方法不止一种并不意味着一种方法是“错误的”,但如果你要使用承诺,你最好利用链接性,它比回调更具可读性。“我看不出把两者混合在一起有什么好处。”我说。这些方法中有一些是错误的,没有一种能产生相同的结果。你可能想看看。最后一个是非常错误的。它立即调用xmlToObject(xml)
,以便将其返回值传递给。它可能会抛出错误,因为未定义xml
。我应该仔细阅读代码。是作为一般性的建议。你说得对,它不适用于这里。@Felix Kling,我错误地添加了xmlToObject(xml)
,它应该是xmlToObject
,没有xml参数,thanksjs是灵活的。做某事的方法不止一种并不意味着一种方法是“错误的”,但如果你要使用承诺,你最好利用链接性,它比回调更具可读性。“我看不出把两者混合在一起有什么好处。”我说。这些方法中有一些是错误的,没有一种能产生相同的结果。你可能想看看。最后一个是非常错误的。它立即调用xmlToObject(xml)
,以便将其返回值传递给。它可能会抛出错误,因为未定义xml
。我应该仔细阅读代码。是作为一般性的建议。你说得对,它不适用于这里。@Felix Kling,我错误地添加了xmlToObject(xml)
,它应该是xmlToObject
,没有xml参数,感谢似乎post
不返回承诺。似乎post
不返回承诺。您也可以将第一个的整个主体替换为xmlToObject
。您也可以将第一个的整个主体替换为xmlToObject
。
….then(function(xml) {
xmlToObject(xml)
// ^ note the missing `return`
}).then(function(obj) {
…
});
post(url, formData).then(function(xml) {
xmlToObject(xml).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
});
return Promise.resolve()
.then(function () {
return post(url, formData);
})
.then(function (xml) {
return xmlToObject(xml);
})
.then(function (object) {
return something;
});