gpt4 book ai didi

node.js - Q.所有请求 promise 数组,不确定如何获得结果

转载 作者:搜寻专家 更新时间:2023-11-01 00:30:54 24 4
gpt4 key购买 nike

这可能是一个明显的答案,但我不确定该采取什么方式。请求是一个 Node 模块:https://github.com/request/request我填充了一组 getHistory 请求(使用不同的参数)。 p = [p1,p2...].

this.app.all('/api/heatmap', function(req,res) {
// fill p here _.each(blabla, p.push(gethistory(someparams...)
var result = [];
function getHistory(params) {
var options = { ...};
var callback = function(error, response, body) {
if(error) { //wtv
} else {
// what to do with the body here ? return body ? result.push(body) ?
}
}

request(options, callback);
}

Q.all(p).then(function() {
});
}

所以这里的问题是,当所有请求都完成时,我将所有内容放入一个数组/对象中,然后将整个内容发送给客户端。如何让 getHistory 返回获取的值(请求完成后)。

希望一切都清楚。

最佳答案

这里的核心问题是 node.js 风格的回调和 promise 不兼容。 Promises 强调返回值,node 强调回调。

因此,您需要一种适配器来正确包装 Node 的回调约定,一个名为 Promisifcation 的进程.这可以手动完成,但充其量是乏味的,并且在您不小心时容易出错。幸运的是,由于 Node 的约定已经确立,它可以自动化。 Q有a few helpers为此,Bluebird 在这方面要方便得多。

所以最简单的方法是切换到 Bluebird 作为 promise 库并使用 promisifyAll

var Promise = require('bluebird');
var request = Promise.promisifyAll(require("request"));

this.app.all('/api/heatmap', function(req, res) {
var requests = blabla.map(function (item) {
return request.getAsync({ /* params */ });
});

Promise.all(requests).then(function (responses) {
res.send( JSON.stringify(responses) ); // whatever
}).catch(function (error) {
res.send( "An error ocurred: " + error ); // handle error
});
}

关于node.js - Q.所有请求 promise 数组,不确定如何获得结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34564759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com