I'm trying to create merge fields in MailChimp from a list if they don't already exist. If they don't exist, I want them to be pushed to a list of promises, where I use promises.all
to make sure that all the necessary list items have been added.
This isn't working though. What am I doing wrong?
var productDict = []
var getMergeNumPromise = new Promise(
function(resolve, reject) {
// call to mailchimp to get the number of merge fields
rp({
uri: MAILCHIMP_MERGEFIELDS_URI,
qs:{count:1},
json:true,
headers:MAILCHIMP_HEADER
})
.then(function( mergeFieldList ) {
console.log("total items: " + mergeFieldList.total_items)
resolve(mergeFieldList.total_items)
})
.catch(function(err) {
console.log("error getting merge field count: " + err)
reject(err)
})
}
)
var getMergeFieldsPromise = new Promise(
function( resolve, reject ) {
getMergeNumPromise.then(function( total, err ){
//gets just the name and tag for all merge fields in the list
rp({
uri: MAILCHIMP_MERGEFIELDS_URI,
qs:{
count: total,
fields: "merge_fields.tag,merge_fields.name"
},
headers: MAILCHIMP_HEADER
})
.then(function( fullFieldList ) {
console.log("FULL FIELD BODY" + fullFieldList)
var body = JSON.parse(fullFieldList)
resolve(body.merge_fields)
})
.catch(function(err){
console.log("error getting fields: " + err)
reject(err)
})
})
}
)
function addMergeField (prodName , dictPos) {
return new Promise (
function(resolve, reject) {
fieldBody = { name : prodName , type : "number"}
//post request to make the new merge field
rp({
method: "POST",
uri: MAILCHIMP_MERGEFIELDS_URI,
json: true,
headers: MAILCHIMP_HEADER,
body: fieldBody
})
.then(function(body) {
//update product dictionary
productDict[dictPos] = {tag : body.tag, name : body.name}
console.log("MERGE FIELD RESPONSE " + JSON.stringify(body))
resolve(body)
})
.catch(function(err) {
console.log("error creating merge field for product id: " + err)
reject(err)
})
}
)
}
var updateMergeFields = getMergeFieldsPromise.then(
function( mergeFieldList ) {
// resolved ids keeps track of ids that have already been added
var resolvedIDS = {}
//holds result of find to look for product ids
var foundMCMatch
// holds productIDS[i]
var product
//console.log("merge field list" + JSON.stringify(mergeFieldList))
for(var i = 0; i < productIDS.length; i++) {
console.log("checking if product id " + productIDS[i] + "exists")
product = productIDS[i]
// tries to find a match to see if fields are already in mailchimp
foundMCMATCH = mergeFieldList.find(x => x.name == product)
if(foundMCMATCH) {
console.log("foundMCMATCH" + JSON.stringify(foundMCMATCH))
//updates product dict with matching tag/name from mailchimp
productDict[i] = {
tag : foundMCMATCH.tag,
name : foundMCMATCH.name
}
//console.log("PRODUCT DICT " + JSON.stringify(productDict))
}
//if field isn't on mailchimp
else if (!resolvedIDS[product])
{
resolvedIDS[product] = true
// adds product id as merge field becasue it doesn't exist
allProductIDPromises.push(
addMergeField(product,i)
)
}
}
}
)
allProductIDPromises.push( getMergeFieldsPromise, getMergeNumPromise, updateMergeFields )
Promise.all(allProductIDPromises)
.then(function() {
//function here that's running out of order
}
NB: I'm using request promise to make my post requests, so they are already promisified.