繁体   English   中英

承诺链接不起作用。 为什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM