我如何链接获取请求并将它们的结果统一为一个数组JS / Node

时间:2018-10-12 03:41:53

标签: javascript node.js request es6-promise

我知道当前代码草率。我仍然对new Chart(document.getElementById("barChartHeadcount"), { type: 'bar', data: { labels: ['Jan', 'Feb', 'Mar'], datasets: [{ label: 'Billed', backgroundColor: 'rgb(0, 197, 106)', data: [56, 63, 67] }, { label: 'Unbilled', backgroundColor: 'rgb(255, 114, 107)', data: [1, 2, 3] }] }, options: { title: { display: true, text: 'Community Headcount' }, tooltips: { mode: 'index', intersect: false }, responsive: true, scales: { xAxes: [{ stacked: false }], yAxes: [{ stacked: false }] }, plugins: { datalabels: { align: 'end', anchor: 'end', backgroundColor: function(context) { return context.dataset.backgroundColor; }, borderRadius: 4, color: 'white', formatter: function(value){ return value + ' (100%) '; } } } } }); 方法不满意。

每次致电都会返回什么

包含一些(但不是全部)结果的数组

我需要的

传递两个不同的uri并连接两个结果,然后将其导出为模块

例如getinfo(uri).getinfo(uri2).then(合并结果)

代码

then

1 个答案:

答案 0 :(得分:1)

您只需要正确使用.then即可,而不丢弃第一个请求的结果

const request = require('request-promise');

const getInfo = (uri) => {

    // Return new promise 
    return request({
        method: 'GET',
        uri: uri,
        json : true,
        headers: {
            'User-Agent': 'Request-Promise'
        }
    });
}

// using promise.then

const result = (url1, url2) => getInfo(url1)
    .then(val1 => getInfo(url2)
        .then(val2 => val1.array.concat(val2.array))
    );

// or async/await

const result = async (url1, url2) => {
    const val1 = await getInfo(url1);
    const val2 = await getInfo(url2);
    return val1.array.concat(val2.array);
};

// both requests done at the same time

const result = (url1, url2) => Promise.all([
    getInfo(url1),
    getInfo(url2)
]).then(([val1, val2]) => val1.array.concat(val2.array));


export result;

//用法

const fn = require("./module.js"); // whatever you call the above file
fn("url1", "url2").then(result => {
    // use result here
});

要解释result的每个化身-使用常规函数将其写出可能会更容易,所以我可以添加注释

const result = function(url1, url2) {
    return getInfo(url1)
    .then(function(val1) {
        return getInfo(url2)
        .then(function(val2) {
            return val1.array.concat(val2.array));
        })
    })
}

通常,您尝试避免“嵌套”。这样的话,但是由于最终结果需要同时使用val1和val2,所以这是不可避免的(不是真的,但是,可以说是这样)

这是异步/等待闪耀的地方

const result = async (url1, url2) => {
    const val1 = await getInfo(url1);
    const val2 = await getInfo(url2);
    return val1.array.concat(val2.array);
};

因为很明显,甚至不需要重写它!

但是,您想并行运行

const result = (url1, url2) => Promise.all([
    getInfo(url1),
    getInfo(url2)
]).then(([val1, val2]) => val1.array.concat(val2.array));

Promise.all接受一个Promise数组,并返回一个可解析为已解决结果数组的Promise

([val1, val2]) => //rest of code

以防您不知道像

(results => {
    let val1 = results[0];
    let val2 = results[1];
    // rest of code

所以,这应该很容易理解