2016-07-12 12 views
0

Ich habe Probleme zu verstehen, was falsch mit dem Code unten ist. Ich habe eine Funktion namens importOrder, die einen Auftrag importiert, indem ein bestimmtes Objekt in ein neues Auftragsobjekt konvertiert wird. Was ich tun möchte, ist, für jedes Produkt (line_item) in dem gegebenen Objekt die Produktdetails zu holen und dem neuen Auftragsobjekt hinzuzufügen (newOrder.products). Das Problem ist, dass das Array immer leer ist. Ich weiß, dass dies eine häufig gestellte Frage ist, aber ich verstehe einfach nicht, was los ist (ist es eine Verschlusssache?)Knoten async Erklärung benötigt

Hier ist der maßgeschneiderte Code

'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 Vielen Dank für die Formatierung meines Beitrags - Ich bin sicher, Ihre Änderungen haben es viel klarer und einfacher für andere zu lesen gemacht! – Ben

+1

Kein Problem, aber Sie müssen noch eine [mcve] hinzufügen, die Eingaben und erwartete und tatsächliche Ausgaben anzeigt, nicht nur dieses Snippet. – jonrsharpe

Antwort

0

Gebrauch ist .map anstelle von .forEach und Rückgabe von Versprechen. Warten Sie dann, bis alle Versprechen mit Promise.all gelöst sind. Und dann können Sie neue Bestellung speichern und erfüllen Sie Ihre importOrderFromShopify Versprechen

+0

Hallo @ user1280859 danke für Ihre Antwort. Ich bin mir nicht sicher, was Sie mit "Array of Versprechungen" meinen. Könnten Sie bitte erläutern? – Ben

+0

@Ben 'var productDetealsPromises = shopifyOrder.line_items.map (Funktion (e) {/ * einige zusätzliche Sachen */return loadProductImage (productId)}); Promise.all (productDetealsPromises) .dann (/ * jetzt sind alle Versprechen erfüllt, du kannst mit dem Ergebnis umgehen und speichern * /) ' –

+0

Vielen Dank! Das hat mir sehr geholfen! – Ben

Verwandte Themen