2016-09-16 4 views
2

私は頭を叩いてこの答えを見つけることができました。 Shopify APIのNode.jsモジュールをmicroappsで使用しています。私はファイルをループし、APIを呼び出す関数を呼び出すために更新する必要がある製品IDとスキューのリストを含むJSONオブジェクトを持っています。 ShopifyのAPIは、それへの呼び出しを制限し、残りの値を含むレスポンスヘッダーを送信します。このノードモジュールは、制限と用途を含むオブジェクトを提供します。私の質問は、以下のコードに基づいて、setTimeoutなどで限界に達するときに缶をする方法です。ここでマイクロアプリケーションNode.jsモジュールを使用してShopifyのAPI呼び出し制限を処理する方法

{ 
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-nodeShopify.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になっているので、消化するのがかなり簡単です。 Rubyから抽象化しても、このコードに基づいて制限を処理する方法を知るには、熟練したJSプログラマーが数分以上かかることはありません。

私はそのShopifyコードを読んで、同じパターンにマッチさせるようにJSコードを試してみることをお勧めします。

関連する問題