1

我有以下功能:

function pickContacts() {
    var output = "";

    // Create the picker
    var picker = new Windows.ApplicationModel.Contacts.ContactPicker();
    picker.commitButtonText = "Select";

    var emailsPromise = new WinJS.Promise(function () {

        // Open the picker for the user to select contacts
        picker.pickMultipleContactsAsync().then(function (contacts) {
            if (contacts.length > 0) {
                // Get selected e-mails                
                contacts.forEach(function (contact) {
                    contact.emails.every(function (email) { output += email.value + ";"; });
                });
                return output;
            } else {
                return "";
            }
        });
    });

    return emailsPromise;
};

这为我提供了来自选定联系人的电子邮件地址列表。所以接下来我想使用它;这是我的代码:

document.getElementById("findEmail").addEventListener("click", function () {
    var emailAdd = document.getElementById("email");
    pickContacts().done(function (emails) {
         emailDets.value = emails;
    });
});

但是我没有从 pickContacts 获得返回值(我已经确定它实际上是返回的)。我猜我处理返回的承诺的方式有问题,但我似乎无法调试它(试图进入它只会退出函数)。

我究竟做错了什么?

4

2 回答 2

2

您不需要创建新的承诺——只需从 pickMultipleContactsAsync.then 中返回承诺。承诺规范说 .then 的返回值是另一个承诺,当您完成的处理程序完成时,履行值是已完成处理程序的返回值。所以你可以这样做:

    return picker.pickMultipleContactsAsync().then(function (contacts) {
        if (contacts.length > 0) {
            // Get selected e-mails                
            contacts.forEach(function (contact) {
                contact.emails.every(function (email) { output += email.value + ";"; });
            });
            return output;
        } else {
            return "";
        }
    });

另一种方式可行,但只是创建了另一个不需要的承诺,并使您的代码更复杂一些。

于 2013-07-30T15:35:08.730 回答
1

您必须将完成的回调作为 Promise 函数的参数传递,然后使用要传递的结果调用它。本质上:

var emailsPromise = new WinJS.Promise(function () {

    // Open the picker for the user to select contacts
    picker.pickMultipleContactsAsync().then(function (contacts) {
        if (contacts.length > 0) {
            // Get selected e-mails                
            contacts.forEach(function (contact) {
                contact.emails.every(function (email) { output += email.value + ";"; });
            });
            return output;
        } else {
            return "";
        }
    });
});

变成:

var emailsPromise = new WinJS.Promise(function (complete, error, progress) {

    // Open the picker for the user to select contacts
    picker.pickMultipleContactsAsync().then(function (contacts) {
        if (contacts.length > 0) {
            // Get selected e-mails                
            contacts.forEach(function (contact) {
                contact.emails.every(function (email) { output += email.value + ";"; });
            });
            complete(output);
        } else {
            complete("");
        }
    });
});
于 2013-03-19T19:48:25.743 回答