[英]Promise chaining not working. Why?
我有以下代码来选择多个联系人,并仅过滤具有XYZ的名称。 我正在使用然后完成以完成此过滤器。 在我的联系人中,有一个名为XYZ Dude的联系人,我也正在选择它。 我在then方法中应用了过滤逻辑之后,是否应该在我的done方法中传递此联系? 任何想法我可能在这里做错了
var picker = new Windows.ApplicationModel.Contacts.ContactPicker();
// Open the picker for the user to select a contact.
picker.pickMultipleContactsAsync().then(function (contacts) {
var contactsStartingWithPrefixPa = contacts.filter(function filterContacts(contact) {
if (contact.name.match(/XYZ/))
return true;
return false;
});
}).done(function (contacts) {
// code never reaches here
if (contacts != null ) {
contacts.forEach(function (contact) {
if (contact !== null) {
// logic to use this contact
}
}
)}
});
return contactsStartingWithPrefixPa
需要在当时的功能。
// Open the picker for the user to select a contact.
picker.pickMultipleContactsAsync().then(function (contacts) {
var contactsStartingWithPrefixPa = contacts.filter(function filterContacts(contact) {
if (contact.name.match(/XYZ/))
return true;
return false;
return contactsStartingWithPrefixPa;
});
除非有充分的理由将过滤器与“使用该触点的逻辑”分开,否则两者都可以在一个循环操作中执行。
var picker = new Windows.ApplicationModel.Contacts.ContactPicker();
// Open the picker for the user to select a contact.
picker.pickMultipleContactsAsync().done(function(contacts) {
if(contacts) {
contacts.forEach(function(contact) {
if(contact.name.match(/XYZ/)) {
// logic to use this contact
}
});
}
});
否则,您将遍历与.filter()
contacts
,然后再次遍历.forEach()
。
如果确实必须将两个方面分开,那么(假设contacts
具有.filter()
方法),您应该能够做到以下几点:
var picker = new Windows.ApplicationModel.Contacts.ContactPicker();
// Open the picker for the user to select a contact.
picker.pickMultipleContactsAsync().then(function(contacts) {
return contacts ? contacts.filter(function(contact) {
return !!contact.name.match(/XYZ/);
}) : [];
}).done(function(contacts) {
contacts.forEach(function(contact) {
// logic to use this contact
});
});
contact.filter的返回值不是一个保证,因此您无需在此处进行任何其他链接。 您的代码应如下所示,因为contactsStartingWithPrefixPa只是联系人的投影,因此您可以直接进行forEach迭代:
picker.pickMultipleContactsAsync().done(function (contacts) {
var contactsStartingWithPrefixPa = contacts.filter(function filterContacts(contact) {
if (contact.name.match(/XYZ/))
return true;
return false;
})
if (contactsStartingWithPrefixPa.length > 0) {
contactsStartingWithPrefixPa.forEach(function (contact) {
//Process
});
}
});
仅当链的每个步骤(最后一步除外)返回新的诺言时,诺言链才有效。 如果没有退货的保证,那么您就没有另一个异步步骤了,因此您可以直接处理所需的东西
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.