Используя данные, которые я получаю из функции запроса снова в node.JS, пока не будет выполнено условие - PullRequest
0 голосов
/ 11 февраля 2020

Я хочу получить доступ к API-интерфейсу shopify, используя Node.js с методом запроса. Я получаю первые 50 наименований, но мне нужно отправить последний идентификатор продуктов, которые я получу в качестве ответа, чтобы он мог l oop по всем продуктам, пока у нас не будет другого идентификатора (я проверяю, если последний массив не Длиной 50).

Поэтому, когда я получаю ответ lastID, я хочу передать его снова той же функции, пока Parraylength не станет равным 50 или нет 0.

Дело в том, что запрос работает асинхронно и я не знаю, как передать ту же функцию с результатом lastID в node.js.

Вот мой код


let importedData = JSON.parse(body);


 //for ( const product in importedData.products ){
  //  console.log(`${importedData.products[product].id}`);    
 //}
 lastID = importedData.products[importedData.products.length-1].id;
 let lastIDD = lastID;
 console.log(`This is ${lastID}`);
 importedData ? console.log('true') : console.log('false');
 let Prarraylength = importedData.products.length;
 console.log(Prarraylength); 
 //console.log(JSON.stringify(req.headers));
 return lastIDD;

});```


1 Ответ

0 голосов
/ 11 февраля 2020

Вы можете использовать для l oop и await для управления потоком вашего скрипта в этом случае.

Я бы предложил использовать request-native- модуль обещания для получения предметов, поскольку он имеет интерфейс, основанный на обещаниях, но вы также можете использовать узел-выборку или топор ios (или любой другой http-клиент).

В этом случае, чтобы показать Вы, логик c, я создал фиктивный RP, который вы обычно создаете следующим образом:

const rp = require("request-promise-native");

Вы можете видеть, что мы перебираем элементы, по 50 за раз. Мы передаем последний идентификатор в качестве параметра url для следующего вызова rp. Теперь, очевидно, все будет по-другому, но я верю, что вы можете легко изменить логи c, как вам нужно.

const totalItems = 155;
const itemsPerCall = 50;

// Mock items array...
const items = Array.from({ length: totalItems}, (v,n) => { return { id: n+1, name: `item #${n+1}` } });

// Mock of request-promise (to show logic..)
// Replace with const rp = require("request-promise-native");
const rp = function(url) {
    let itemPointer = parseInt(url.split("/").slice(-1)[0]);
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            let slice = items.slice(itemPointer, itemPointer + itemsPerCall);
            itemPointer += itemsPerCall;
            resolve( { products: slice });
        }, 500); 
    })    
}

async function getMultipleRequests() {
    let callIndex = 0;
    let lastID = 0;
    const MAX_CALLS = 20; 
    const EXPECTED_ARRAY_LENGTH = 50;
    
    for(let callCount = 1; callCount < MAX_CALLS; callCount++) {
        // Replace with the actual url..
        let url = "/products/" + lastID;
        let importedData = await rp(url);
        lastID = importedData.products[importedData.products.length - 1].id;
        console.log("Call #: " + ++callIndex + ", Item count: " + importedData.products.length +  ", lastID: " + lastID);
        if (importedData.products.length < EXPECTED_ARRAY_LENGTH) {
            console.log("Reached the end of products...exiting loop...");
            break;
        }
    }
}

getMultipleRequests();
...