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;
@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
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