2016-07-12 10 views
0

以下のコードで何がうまくいかないのか理解できません。私はimportOrderと呼ばれる関数を持っています。これは、指定されたオブジェクトを新しい注文オブジェクトに変換することによって注文をインポートします。私がしたいのは、指定されたオブジェクト内の各製品(line_item)について、製品の詳細を取り出して新しい注文オブジェクト(newOrder.products)に追加することです。問題は配列が常に空であることです。特注コードノード非同期の説明が必要

'use strict'; 
 

 
var Promise = require('promise'); 
 
var Order = require('./models/order'); 
 
var shopifyAPI = require('shopify-node-api'); 
 
var config = require('config'); 
 

 
var orderImporter = { 
 

 
    importOrderFromShopify: function (shopifyOrder) { 
 

 
    return new Promise(function(fulfill, reject){ 
 
     var newOrder = new Order({ 
 
     external_id: shopifyOrder.name, 
 
     status: 'Awaiting Fulfillment', 
 
     date_created: shopifyOrder.created_at, 
 
     subtotal_inc_tax: shopifyOrder.subtotal_price, 
 
     tracking_number: "", 
 
     order_source: "www", 
 
     payment_method: "Credit Card", 
 
     invoice_printed_at: null, 
 
     packing_slip_printed_at: null, 
 
     products: [], // this is the array I would like to populate with product details fetched from shopify 
 
     product_options: [] 
 
     }); 
 

 
     shopifyOrder.line_items.forEach(function(lineItem){ 
 
     var productId = lineItem.product_id; 
 
     var product = {}; 
 
     (function(newOrder){ 
 
      loadProductImage(productId) 
 
      .then(function(imageUrl){ 
 
       product.image = imageUrl; 
 
       newOrder.products.push(product); 
 
      }, function(error){ 
 
       console.log(error); 
 
      }); 
 
     })(newOrder); 
 
     }); 
 

 
     newOrder.save(function(error){ 
 
     if (error){ 
 
      reject(error); 
 
     } else { 
 
      fulfill(newOrder); 
 
     } 
 
     }); 
 

 
    }); 
 

 

 
    function loadProductImage(productId){ 
 

 
     return new Promise(function(fulfill, reject){ 
 
     var shopifyClient = new shopifyAPI({ 
 
      shop: config.get('shopify_config.shop'), 
 
      shopify_api_key: 'xxxx', 
 
      shopify_shared_secret: 'yyyyy', 
 
      access_token: 'zzzzzzzz', 
 
      verbose: false 
 
     }); 
 

 
     shopifyClient.get('/admin/products/' + productId + '/images.json', function(error, data){ 
 

 
      if(error){ 
 
      reject(error); 
 
      } else { 
 
      fulfill(data.images[0].src); 
 
      } 
 
     }); 
 
     }); 
 

 
    } 
 

 
    } 
 
}; 
 

 
module.exports = orderImporter;

+0

@jonrsharpe私の投稿をフォーマットしていただきありがとうございます - あなたの変更により、他の人が読むことがもっと簡単になりました! – Ben

+1

問題はありませんが、[mcve]を追加する必要があります。これは、このスニペットだけでなく、入力と予想される出力と実際の出力を示します。 – jonrsharpe

答えて

0

使用であるここで私は、これは一般的な質問ですけど、私はちょうど(それが閉鎖の事です?)で何が起こっているか理解していない

.forEachの代わりに.mapと約束を返します。その後、すべての約束がPromise.allで解決されるまで待ちます。そして、あなたは新しい注文を保存し、あなたのimportOrderFromShopify約束を達成することができます

+0

こんにちは@ user1280859お返事ありがとうございます。私はあなたが「約束の戻り値」によって何を意味するのか分かりません。どうぞあなたは詳しく教えていただけますか? – Ben

+0

@Ben 'var productDetealsPromises = shopifyOrder.line_items.map(function(e){/ *いくつかの追加項目*/return loadProductImage(productId)}); Promise.all(productDetealsPromises).then(/ *すべての約束が成就しました。あなたは結果を処理して保存することができます/) ' –

+0

ありがとう!これは私を助けてくれました! – Ben