Promisified请求不会返回正确的解决结果

时间:2015-10-08 11:56:32

标签: javascript node.js request promise

我正在尝试将request与Bluebird' s Promises一起使用:

const request = Promise.promisify(require('request'));
Promise.promisifyAll(request);

不幸的是,我得到的结果并没有反映我根据例子预期的结果:

request('http://google.com').then(function(content) {
  // content !== String
  // Object.keys(content) => ['0', '1']
};
  • 内容不是字符串
  • 我必须分别通过content['0'] content['1']访问内容,这里是我实际预期的响应,HTML字符串是。

这对我来说似乎很可疑,就像我在这里滥用Promise API一样。我做错了什么?

3 个答案:

答案 0 :(得分:0)

使用.spread(function(response, content){})代替.then(function(content){})

答案 1 :(得分:0)

为什么不使用本机节点的Promises?

function req() {
  return new Promise (function(resolve, reject){
    request('http://google.com',function (error, response, body){
      if (error)
        reject(error);
      resolve(body) //if json, JSON.parse(body) instead of body
    });
  });
}
req().then(data => doSomethingWithData);

答案 2 :(得分:0)

您应该使用spread()而不是then()。 这是bluebird的链接,它解释了spread()的用法。

https://github.com/petkaantonov/bluebird/blob/2.x/API.md#spreadfunction-fulfilledhandler--function-rejectedhandler----promise

请求的所有回调函数由三个参数组成(错误,响应,内容)。在promisifed请求中,err由catch()处理。

但是如何将其他两个参数传递给下一个链式回调函数?然后()无法实现。

因此,promisifed请求将返回两个承诺的数组,一个将返回 repsonse ,另一个内容。并且它们可以被spread()方法捕获,该方法能够捕获固定大小的promise数组。