我正在尝试将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一样。我做错了什么?
答案 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()的用法。
请求的所有回调函数由三个参数组成(错误,响应,内容)。在promisifed请求中,err由catch()处理。
但是如何将其他两个参数传递给下一个链式回调函数?然后()无法实现。
因此,promisifed请求将返回两个承诺的数组,一个将返回 repsonse ,另一个内容。并且它们可以被spread()方法捕获,该方法能够捕获固定大小的promise数组。