Ich habe seltsame Fehler, die manchmal auf meiner WinJS-App auf dem Windows Phone 8.1 512MB RAM-Emulator auftritt. Ich konnte es nicht auf anderen Emulator-Instanzen oder auf dem Gerät reproduzieren.WinJS: Promise-Kette klebt manchmal nach der Verwendung der BackgroundUploader-Klasse auf 512MB WinPhone8.1 Emu
Die Ausführung läuft durch die Versprechen Kette und beendet die folgende Anweisung return:
return (currentUpload = uploadOperation.startAsync());
Danach passiert nichts. Ich setze Haltepunkte bei allen drei Funktionen (Erfolg, Fehler, ausstehend), die der .then-Definition gegeben werden. Keiner dieser drei Funktionscodes wird jemals erreicht, wenn dieser seltsame Fall auftritt.
Ich habe auch diese Return-Anweisung auf einen Versuch Catch-Block, aber es gab keine Ausnahme zu fangen.
kurze Erklärung Code:
Hintergrund Uploader Instanz (benutzerdefinierte Header + PUT-Methode)
StorageFile von URI
geöffnet Uploader dieser Datei laden preparesHintergrund erstellt (Definition von uploadOperation)
uploadOperation wird gestartet
siehe vollständigen Code:
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
});
}
Vielen Dank für jede Hilfe!
P.S. Ich habe auch eine veraltete Warnung, obwohl ich nicht Gruppe/TransferGroup auf der BackgroundUploader-Klasse:
Verfahren Windows.Networking.BackgroundTransfer.IBackgroundTransferBase.put_Group ist veraltet. Die Gruppe kann für die Versionen nach Windows 8.1 geändert oder nicht verfügbar sein. Verwenden Sie stattdessen TransferGroup.
Vielleicht ist es mit diesem Versprechen Kettenfehler verbunden.
Offenbar verstehe ich nicht, was Sie mit 'return (currentUpload = uploadOperation.startAsync());' erreichen wollen. Auch du hast versaut, dass du Verkettung versprichst. Bei der Verkettung von Versprechungen muss die Fehlerbehandlung am Ende und für alle von ihnen durchgeführt werden. Das ist die Schönheit der Versprechensverkettung. – sebagomez
Diese Anweisung speichert den aktuellen Upload in einer globalen Variablen. Stellen Sie sich vor, es wäre return uploadOperation.startAsync() - getestet, Fehler ist dann auch aufgetreten. Was meinst du mit "vermasselt"? Sprechen Sie über Best Practice und Style oder könnte dies zu einem Fehler führen? Der Grund, warum ich das gemacht habe, ist, dass es mir nur einen "WinRT-Fehler" gab, so dass ich die Fehler nicht richtig unterscheiden konnte (es gibt einen Text, aber dieser ist an eine bestimmte Sprache gebunden). – kerosene
Gemäß der [MSDN-Dokumentation] (https://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.backgroundtransfer.downloadoperation.startasync.aspx) kann diese Funktion die Leistung beeinträchtigen. Vielleicht erleben Sie eine Verlangsamung. Sie empfehlen, "dass Sie StartAsync auf einem Hintergrund-Worker-Thread aufrufen ..." Könnte dies die Ursache Ihres Problems sein? – Jimmy