Ich habe eine Funktion, die eine Verbindung zur DB herstellen muss, um ein Upload-Token zu erhalten, dann eine Datei hochladen, dann den Stream schließen und die Datei in der Datenbank protokollieren. Ich habe Schwierigkeiten, all das zusammen zu verketten.Problem bei der Bildung einer Versprechenskette
var saveNewRequest = function (image_arr) {
return $.ajax({
url: 'http://' + AppVar.ServerUrlWithPort + '/restapi/MtReqNewRequest_SaveData',
type: 'POST',
data: JSON.stringify({
'SessionId': AppVar.SessionId,
'Name': $('#MtReqNewRequest_name').val(),
'Desc': $('#MtReqNewRequest_desc').val(),
'Obj': $('#MtReqNewRequest_obj').val(),
'Priority': $('#MtReqNewRequest_priority2').val(),
'Status': $('#MtReqNewRequest_status2').val(),
'Type': $('#MtReqNewRequest_type2').val()
}),
dataType: 'json',
contentType: "application/json",
timeout: 10000
}).done(function (response) {
if (response.ResultCode === '0') {
if (image_arr.length != 0) {
//this is recursively called upload function which returns jQuery promise (this works as intended)
// the promise resolves with RequestId which I need later on
return uploadImages(image_arr, image_arr.length, 0, response.RequestId)
} else {
//I would like this to return just this RequestId
Promise.resolve(response.RequestId)
}
} else {
Promise.reject().promise();
}
}).fail(function (x, t, m) {
if (t === "timeout") {
reject("Timeout: " + t);
} else {
reject($.i18n('Error-RetrivingDataProblem'));
}
})
}
Und ich nenne dies in einer Veranstaltung:
MtReq.saveNewRequest(image_arr).then(function (output) {
AppVar.nav.popPage().then(function() {
Utility.hideModalWithProgressBar();
if (!isNaN(output)) {
setTimeout(500, AppVar.nav.pushPage("MtReqRequestPage.html", { animation: "slide", id: output }));
}
})
}).catch(function (e) {
Utility.hideModalWithProgressBar();
ons.notification.alert(e);
})
Ich brauche die RequestID zum AppVar.nav.pushPage
, passieren die Seite zu öffnen ich gerade erstellt haben. Allerdings bekomme ich die vollständige Antwort der allerersten Ajax-Anfrage in saveNewRequest
.
Dies ist Cordova App, mit OnsenUI-Framework (aber das ist nicht relevant für das Problem). Außerdem benutze ich die neuesten BluebirdJs als Promise Polyfill (was meines Wissens JS und jQuery verspricht kompatibel machen sollte).
Danke für jede Hilfe!
Hinweis: 'Promise.reject()' hat keine Methode '.promise()'. 'reject()' ist nicht definiert in '.fail()'. – guest271314
Danke. Ich lerne immer noch, wie Versprechen funktionieren. Es ist manchmal ziemlich verwirrend. Trotzdem löst das das Problem nicht wirklich. – rancor1223