我可以在.then参数中使用promise吗?

时间:2016-11-23 02:00:17

标签: javascript node.js promise bluebird

我有两个功能:

第一个创建一个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
})

4 个答案:

答案 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进行一些工作,nestingobj!)是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;
    });