2016-08-29 4 views
0

Mein Code:Resolving Promises Asynchron in AngularJS

$q(function (resolve) { 
    var imageUploadResults = []; 
    fileUploadService.uploadImage($scope.filesUpload, "/api/mailbox/uploadAttachFile", function (result) { 
     console.log(result); 
     imageUploadResults.push(result.LocalFilePath); 
    }); 
    $scope.mail.Files = imageUploadResults; 
    resolve($scope.mail); 
}).then(function (mail) { 
    console.log(mail); 
    apiService.post("/api/mailbox/sendMail", mail, sendMailSucceed, sendMailFailed); 
}); 

erwarten:
Ich möchte Finish mail.Files Wert hinzufügen möchten, dann rufen Sie apiService.post()

Aktuell:
Aber es führen apiService.post() mit mail.Files Wert ist [].
Wenn apiService.post() ausführen mail.Files Rückkehr value.length> 0

+0

Sie Ihr Versprechen sofort zu lösen .. Sie innerhalb des Rückrufs des .uploadImage() aufrufen – mhodges

Antwort

-1

Ihre .then Funktion beenden sollte $ scope.mail verwenden und nicht als Parameter Mail? Im Moment verschicken Sie anstelle des Mail-Objekts ein leeres Objekt.

1

Wenn Sie $scope.mail.Files = imageUploadResults; zugeordnet und behoben resolve($scope.mail); gibt es keine Garantie, dass fileUploadService.uploadImage Anfrage abgeschlossen und gespeichert imageUploadResults.push(result.LocalFilePath);

Mögliche Lösung ist resolve($scope.mail); direkt nach imageUploadResults.push(result.LocalFilePath); in Funktion zu fileUploadService.uploadImage

2

Ohne genau zu wissen, welche Bibliothek Sie weitergegeben hinzufügen tatsächlich verwenden, scheint mir klar, dass fileUploadService.uploadImage() asynchron ist.

Die Funktion, die Sie als Argument angeben, ist ein Rückruf, und es gibt keine Garantie, dass sie "pünktlich" ausgeführt wird. In Ihrem Fall wird der Pfad zu imageUploadResults hinzugefügt, nachdem Sie $scope.mail.Files festgelegt haben.

sollten Sie $scope.mail.Files setzen und resolve in Ihrer Rückruffunktion aufrufen.

$q(function (resolve) { 
    var imageUploadResults = []; 
    fileUploadService.uploadImage($scope.filesUpload, "/api/mailbox/uploadAttachFile", function (result) { 
     console.log(result); 
     imageUploadResults.push(result.LocalFilePath); 
     $scope.mail.Files = imageUploadResults; 
     resolve($scope.mail); 
    }); 
}).then(function (mail) { 
    console.log(mail); 
    apiService.post("/api/mailbox/sendMail", mail, sendMailSucceed, sendMailFailed); 
}); 
+0

Dank für Ihre Hilfe, das Versprechen werden lösen sollte. Es funktioniert gut –