2017-11-28 2 views
0

Ich versuche, ein Array namens pw_array zu erstellen, den Inhalt von pw_subscribers zu diesem Array zuweisen, dann jedes Objekt in der pw_array mit neuen Schlüssel Wert Paare aus der zweiten Versprechen. Ich bin neu in Versprechungen und habe viele Schwierigkeiten, diese Arbeit zu machen. Gerade jetzt, wenn ich console.log (pw_customer) innerhalb der zweiten Versprechen innerhalb der getCustomers Funktion, es gibt zurück, was ich will. Aber wenn ich später console.log (pw_array), ist es das ursprüngliche Array.Holen Sie Objekt Array Versprechen, dann über Objekte iterieren

var pw_array = []; 
//first promise is working correctly 
var getPaywhirlSubscribers = new Promise(function(resolve, reject) { 

paywhirl.Subscriptions.getsubscribers({limit:100}, function(error, pw_subscribers) { 
     Promise.all(JSON.parse(pw_subscribers).forEach(function(pw_subscriber) { 
      pw_array.push(pw_subscriber); 
     })) 
     // console.log(pw_array); 
     return resolve(pw_array); 
    }); 
}); 

var getGatewayReferences = function(pw_array) { 
    return new Promise(function(resolve, reject) { 
     Promise.all(pw_array.forEach(function(pw_customer) { 
      paywhirl.Customers.getCustomer(pw_customer.customer_id, function(error, customer) { 
       pw_customer.phone = customer.phone; 
       pw_customer.address = customer.address; 
       pw_customer.gateway_reference = customer.gateway_reference; 
       // this console.log is returning what I want 
       // console.log(pw_customer); 
      }); 
     })); 
     resolve(pw_array); 
     // console.log(pw_array); 
    }); 
}; 

und das Versprechen Kette ...

getPaywhirlSubscribers.then(getGatewayReferences).then(function(pw_array) { 
    // this console.log is returning the original pw_array with pw_subscribers but not with the appended pw_customer keys 
    console.log(pw_array); 
}); 
+1

Haben Sie versucht, 'pw_array.map' anstelle von' pw_array.forEach' zu verwenden, und für die Karte geben Sie den 'paywhirl.Customers.getCustomer (...' (was ich annehme, macht ein Versprechen). Auf diese Weise der nächste ".then" wird alle Kunden haben. – asosnovsky

+1

@asosnovsky ist korrekt, Sie mutieren nur jedes Element in dem 'pw_array', das Ihnen von' forEach' gegeben wird. Diese Elemente sind nicht "live" mit dem ursprünglichen 'pw_array verbunden '' zu der Zeit. Sie sollten '.map' verwenden – gotomanners

Antwort

1

Alle Ihre Code kann

var getPaywhirlSubscribers = function() { 
    return new Promise(function(res, rej) { 
    paywhirl.Subscriptions.getSubscribers({limit:100}, function(err, subs) { 
     if (err) { 
     rej(err); 
     } else { 
     res(JSON.parse(subs)); 
     } 
    }); 
    }); 
}; 

var gatewayRefs = function(promiseOfArray) { 
    return promiseOfArray.then(function(subs) { 
    return Promise.all(subs.map(function(sub) { 
     return new Promise(function(res, rej) { 
     paywhirl.Customers.getCustomer(sub.customer_id, function(err, customer) { 
      if (err) { 
      rej(err); 
      } else { 
      res(Object.assign({}, sub, customer); 
      } 
     }); 
     }); 
    }); 
    }); 
}; 

gatewayRefs(getPaywhirlSubscribers()).then(function(arrayOfCustomers) { 
    // do something with the customer array 
}); 

Hinweis

reduziert werden, dass Sie dies noch kürzer machen kann/einfacher, wenn Sie einen verwenden der vielen Dienstprogramme, die zur automatischen Konvertierung von node.js-style error - Erste Callback-APIs in Promise-basierte APIs zur Verfügung stehen. Suche nach 'versprechen denodefy'.

Sie könnten auch einige der Schritte in eine .then Kette ziehen, um Verschachtelung zu reduzieren, aber das ist so viel ästhetisch wie praktisch IMHO.

+0

Vielen Dank! Das hat perfekt funktioniert. – David

+0

@David kein Problem. Denken Sie daran, dass Sie eine Promise nicht 'auspacken' können (wie die Werte in ein externes Array) muss mit den Daten * nur * in einem '.then'-Handler umgehen. –

Verwandte Themen