2013-03-19 75 views
1

我有以下功能:Windows 8中的Javascript少輝

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(我確定實際返回)得到返回值。我猜測我處理返回的承諾的方式有些問題,但我似乎無法調試它(嘗試進入它只是退出函數)。

我在做什麼錯?

回答

1

您必須將完成的回調作爲您的承諾函數的參數傳遞,然後用您想要傳遞的結果調用它。 Esseintially:

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(""); 
     } 
    }); 
}); 
2

你並不需要創建一個新的承諾 - 只返回從pickMultipleContactsAsync.then的承諾。 Promise規範聲明,.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 ""; 
     } 
    }); 

另一種方式工作,但只是創建了不需要的又一承諾,讓你的代碼稍微複雜一些。