Ich versuche, eine Datei auf einen Remote-Server hochladen, den Pfad für diese Datei auf diesem Server abrufen, und speichern Sie es dann in einem Datensatz auf meine eigene API. Über die Hälfte der Zeit stürzt der Code ab, da returnedNewFile nicht definiert ist (obwohl ich console.log (newFile) in der vorherigen .then() -Funktion überprüft habe und es immer ein Promise-Objekt ist. Was könnte dieses Verhalten verursachen? Was könnte verursachen? returnedNewFile manchmal null/undefiniert sein? ich verwende Django REST + django-rest-json-api + Ember.js 2,6, und dieser Code ist in einer JavaScript-Datei der Komponente. Vielen Dank im Voraus!Javascript Versprechen Verkettung Probleme (Ember)
store.findRecord('file', folderid).then(function(folder) {
var file = fileList.pop();
var newFile = fm.uploadFile(folder, file.name, file);
return newFile;
}).then(function(returnedNewFile) {
var name = returnedNewFile.get('name');
var path = returnedNewFile.get('path');
var doc = store.createRecord('document', {
name: name,
path: path,
});
console.log("doc: ", doc);
doc.save();
return doc;
}).then(function(doc) {
console.log("hi number three");
var grant = store.createRecord('grant', {
department: department,
number: number,
document: doc,
});
grant.save();
return grant;
}).then(null, function(error) {
console.log("Oops: " + error.message)
});
EDIT: Hier ist der Code für uploadFile()
(waterbutler ist der Name des Dateiservers auf dem externen Server verwendet wird (link)):
uploadFile(folder, name, contents, options = {}) {
let url = folder.get('links').upload;
options.data = contents;
if (!options.query) {
options.query = {};
}
options.query.name = name;
options.query.kind = 'file';
let p = this._waterbutlerRequest('PUT', url, options);
return p.then(() => this._getNewFileInfo(folder, name));
}
Und hier ist der Code für _getNewFileInfo:
/**
* Get the `file` model for a newly created file.
*
* @method _getNewFileInfo
* @private
* @param {file} parentFolder Model for the new file's parent folder.
* @param {String} name Name of the new file.
* @return {Promise} Promise that resolves to the new file's model or
* rejects with an error message.
*/
_getNewFileInfo(parentFolder, name) {
let p = this._reloadModel(parentFolder.get('files'));
return p.then((files) => files.findBy('name', name));
}
Wäre 'fm.uploadFile()' nicht asynchron? Von welchem Modul node.js stammt das, damit wir uns das Dokument ansehen können? – jfriend00
[Hier ist] (https://github.com/CenterForOpenScience/ember-osf/blob/develop/addon/services/file-manager.js) ein Link zu der Datei-Manager (FM) -Klasse. 'fm.uploadFile()' ist asynchron, aber ich hatte den Eindruck, dass diese Art der Verkettung dafür verantwortlich ist. Klingt, als ob ich vielleicht weg wäre. – Cameron
Es könnte immer eine "Promise" -Instanz sein, aber es könnte manchmal ein Versprechen sein, das mit "undefined" erfüllt. Zeigen Sie uns, was '_getNewFileInfo' tut. – Bergi