2016-11-01 4 views
0

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!

+1

Hinweis: 'Promise.reject()' hat keine Methode '.promise()'. 'reject()' ist nicht definiert in '.fail()'. – guest271314

+0

Danke. Ich lerne immer noch, wie Versprechen funktionieren. Es ist manchmal ziemlich verwirrend. Trotzdem löst das das Problem nicht wirklich. – rancor1223

Antwort

1

Ersatz .then() für .done(); .done() gibt das gleiche jQuery-Zusicherungsobjekt zurück, das von $.ajax() zurückgegeben wird. return der Promise oder ein anderer Wert von .then().

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 
    }).then(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 
       // added `return` 
       return Promise.resolve(response.RequestId) 
      } 
     } else { 
      // note `return`, removed `.promise()` 
      return Promise.reject()   
     } 
    }).fail(function (x, t, m) { 
     if (t === "timeout") { 
      // included `Promise`, chain `.reject()` 
      // note, `return` 
      return Promise.reject("Timeout: " + t); 
     } else { 
      // note `Promise.reject()`, added `return` 
      return Promise.reject($.i18n('Error-RetrivingDataProblem')); 
     } 
    }) 
} 
+0

Perfekt! Vielen Dank, ich bin schon seit Tagen hier ... – rancor1223

+0

Übrigens, ich war unter Eindruck, dass ich 'zurück' nicht zurückgeben/ablehnen (http://stackoverflow.com/questions/32536049/do-i-need -zurückkehren-nach-früher-auflösen-ablehnen. Oder ist es einfach egal? – rancor1223

+1

'resolve()', 'reject()' in 'Promise' Konstruktor ist nicht dasselbe wie' Promise.resolve() ',' Promise.reject() ' – guest271314

Verwandte Themen