2016-09-16 4 views
2

Я ударился головой, нахожу ответ для этого, я просто не могу понять. Я использую модуль Node.js для Shopify API на microapps. У меня есть объект JSON, содержащий список идентификаторов продуктов и skus, которые мне нужно обновить, поэтому я просматриваю файл и вызываю функцию, вызывающую api. API-интерфейс Shopify ограничивает его вызовы и отправляет заголовок ответа с оставшимся значением. Эти узловые модули предоставляют объект, содержащий ограничения и использование. Мой вопрос основан на приведенном ниже коде, как можно на setTimeout или аналогичном, когда я достигаю предела. После того, как вы сделаете свой первый вызов будет возвращать пределы объекта, как это:Как справиться с лимитом вызовов API Shopify с помощью microapps Модуль Node.js

{ 
remaining: 30, 
current: 10, 
max: 40 
} 

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

const products = JSON.parse(fs.readFileSync('./skus.json','utf8')); 

for(var i = 0;i < products.length; i++) { 
    updateProduct(products[i]); 
} 

function updateProduct(product){ 
    shopify.productVariant.update(variant.id, { sku: variant.sku }) 
    .then(result => cb(shopify.callLimits.remaining)) 
    .catch(err => console.error(err.statusMessage)); 
} 

Я знаю, что нужно реализовать какой-то обратный вызов, чтобы проверить, осталось ли оставшееся использование, а затем подождать несколько секунд, прежде чем снова звонить. Любая помощь будет принята с благодарностью.

ответ

2

Я бы использовал что-то, чтобы ограничить скорость выполнения функции, используемой shopify-api-node (Shopify.prototype.request), чтобы создать запрос, например https://github.com/lpinca/valvelet.

Код ниже не проверен, но должен работать. Он должен соблюдать ограничение в 2 вызова в секунду.

var Shopify = require('shopify-api-node'); 
var valvelet = require('valvelet'); 

var products = require('./skus'); 

var shopify = new Shopify({ 
    shopName: 'your-shop-name', 
    apiKey: 'your-api-key', 
    password: 'your-app-password' 
}); 

// Prevent the private shopify.request method from being called more than twice per second. 
shopify.request = valvelet(shopify.request, 2, 1000); 

var promises = products.map(function (product) { 
    return shopify.productVariant.update(product.id, { sku: product.sku }); 
}); 

Promise.all(promises).then(function (values) { 
    // Do something with the responses. 
}).catch(function (err) { 
    console.error(err.stack); 
}); 
0

Если вы посмотрите код Shopify, их репозиторий github имеет CLI. Эта CLI имеет дело с ограничениями. Вы можете быстро узнать, как Shopify занимается этими ограничениями, глядя на их код.

Поскольку их код находится в Ruby, его довольно легко переварить. Он не должен использовать опытного программиста JS более нескольких минут, чтобы увидеть, как справляться с ограничениями на основе этого кода, даже абстрагируясь от Ruby.

Итак, мое предложение - прочитать код Shopify и попробовать, а затем преобразовать ваш JS-код в соответствие с тем же шаблоном.

Смежные вопросы