簡體   English   中英

獲取對象數組Promise,然后遍歷對象

[英]Get object array promise, then iterate over objects

我正在嘗試創建一個名為pw_array的數組,將pw_subscribers的內容分配給該數組,然后將pw_array中的每個對象附加來自第二個promise的新鍵值對。 我是新來的諾言,在完成這項工作時遇到很多麻煩。 現在,當我在getProfers函數內的第二個Promise內console.log(pw_customer)時,它正在返回我想要的東西。 但是,當我稍后console.log(pw_array)時,它是原始數組。

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);
    });
};

和承諾鏈...

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);
});

您所有的代碼都可以簡化為

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
});

請注意,如果您使用許多可用的實用程序之一來自動將node.js樣式的error-first回調API轉換為基於Promise的API,則可以使其更短/更簡單。 搜索“ promise denodeify”。

您也可以想象將某些步驟拉到.then鏈中以減少嵌套,但這與實際的IMHO一樣美觀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM