Как связать запросы в цепочку и объединить результат обоих в массив JS / Node? - PullRequest
0 голосов
/ 12 октября 2018

Текущий код небрежный, я знаю.Я все еще сомневаюсь в методе then.

То, что каждый вызов get возвращает

массив с некоторыми, не всеми, результатами

Что мне нужно

, чтобы передать два разных URI и объединить результат обоих, а затем экспортировать его как модуль

например, getinfo (uri) .getinfo (uri2) .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'
      }
    });
}

const promise = getInfo(url1).then((val) => {
  let store = [];
  getInfo(url2).then((val2) => {
    store = store.concat(val2.array);
    return store;
  })
});
//ideally
export promise;

1 Ответ

0 голосов
/ 12 октября 2018

Вам просто нужно правильно использовать .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);
};

Нет необходимости даже переписывать это, потому что это понятно!

Однако вы хотите запустить Parallel

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

Promise.all принимает массив обещаний и возвращает обещание, которое разрешается в массив разрешенных результатов

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

в случае, если вы не знали, это как

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

Итак, это должно быть довольно легко понять, как это

...