Mam dziwny błąd, który czasami pojawia się w mojej aplikacji WinJS na emulatorze RAM Windows Phone 8.1 512 MB. Nie mogłem odtworzyć go w innych instancjach Emulatora lub na urządzeniu.WinJS: Łańcuch obietnicy czasami trzyma się po użyciu klasy BackgroundUploader na 512 MB WinPhone 8.1 Emu
Realizacja przebiega łańcucha obietnicy i kończy następujące return:
return (currentUpload = uploadOperation.startAsync());
Po że nic się nie dzieje. Ustawiam punkty przerwania dla wszystkich trzech funkcji (sukces, niepowodzenie, oczekiwanie), które są podane w definicji .then. Żaden z tych trzech kodów funkcji nigdy nie zostanie osiągnięty, gdy pojawi się ten dziwny przypadek.
Umieściłem także to oświadczenie zwrotu na bloku catch próby, ale nie było wyjątku do połowu.
krótkie wyjaśnienie kodu: jest tworzony
Tło instancja Uploader (nagłówki niestandardowe + metody PUT)
StorageFile jest otwarty przez URI
uploader Tło sporządza przesłać tego pliku (definicja uploadOperation)
Funkcja uploadOperation zostanie uruchomiona
zobaczyć pełny kod:
var currentUpload; // global
function uploadFile(localFullPath, headers, serverUrl)
{
var fileUri = new Windows.Foundation.Uri('ms-appdata:///local' + localFullPath),
uploader = false;
try
{
uploader = new Windows.Networking.BackgroundTransfer.BackgroundUploader();
uploader.method = 'PUT';
// set headers to uploader
for (var key in headers)
{
if (headers.hasOwnProperty(key))
uploader.setRequestHeader(key, headers[key]);
}
}
catch (e)
{
// error handling
return false;
}
Windows.Storage.StorageFile.getFileFromApplicationUriAsync(fileUri)
.then(function success(file)
{
return uploader.createUpload(serverUrl, file);
},
function failure(error)
{
return WinJS.Promise.wrapError('file not found');
})
.then(function (uploadOperation)
{
if (currentUpload == 'Canceled')
return WinJS.Promise.wrapError('upload canceled');
else
return (currentUpload = uploadOperation.startAsync());
})
.then(function success(success)
{
currentUpload = false;
// success handling
return true;
}, function failure(error)
{
currentUpload = false;
// error handling
return false;
}
}, function pending(status)
{
var progress = status.progress,
percent = Math.round(progress.bytesSent/progress.totalBytesToSend * 100);
// progress handling
});
}
dzięki za pomoc!
P.S. Dostałam też przestarzałej ostrzeżenie, chociaż nie używam grupy/TransferGroup od klasy BackgroundUploader:
Sposób Windows.Networking.BackgroundTransfer.IBackgroundTransferBase.put_Group została zaniechana. Grupa może być zmieniona lub niedostępna dla wersji po Windows 8.1. Zamiast tego użyj TransferGroup.
Być może jest to związane z tym obietnicą błędu łańcucha.
Szczerze mówiąc, nie rozumiem, co próbujesz osiągnąć za pomocą 'return (currentUpload = uploadOperation.startAsync());'. Poza tym zawiedliście, obiecując łańcuch. Podczas łączenia obietnic, obsługa błędów musi zostać wykonana na końcu i dla wszystkich. To piękno obietnicy przykuwającej uwagę. – sebagomez
Ta instrukcja zapisuje bieżące przesłanie w zmiennej globalnej. Wyobraź sobie, że będzie to powrót uploadOperation.startAsync() - przetestował go, wystąpił również błąd. Co masz na myśli mówiąc "pomieszany"? Czy mówisz o najlepszej praktyce i stylu, czy może to prowadzić do błędu? Powód, dla którego zrobiłem to, co to tylko dało mi "błąd WinRT", więc nie mogłem prawidłowo rozróżnić błędów (jest tekst, ale jest to związane z określonym językiem). – kerosene
Zgodnie z [Dokumentacją MSDN] (https://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.backgroundtransfer.downloadoperation.startasync.aspx) ta funkcja może obniżyć wydajność. Być może doświadczasz spowolnienia. Zalecają "wywołanie funkcji StartAsync w wątku pracującym w tle ..." Czy to może być źródłem Twojego problemu? – Jimmy