Javascript 我可以在辩论中使用承诺吗?

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

我有两个功能:

第一个生成一个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 (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;
    });