[英]Javascript Promise Chaining Issues (Ember)
我正在嘗試將文件上傳到遠程服務器,在該服務器上獲取該文件的路徑,然后將其保存到我自己的API的記錄中。 超過一半的時間,代碼崩潰是因為returnNewFile是未定義的(盡管我已經在上一個.then()函數中檢查console.log(newFile),並且它始終是一個promise對象。可能導致此現象的原因是什么? returnNewFile有時為null / undefined?我正在使用Django REST + django-rest-json-api + ember.js 2.6,並且此代碼在組件的javascript文件中,謝謝!
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)
});
編輯:這是uploadFile()
的代碼(waterbutler是在外部服務器( 鏈接 )上使用的文件服務器的名稱):
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));
}
這是_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));
}
超過一半的時間,代碼崩潰是因為returnNewFile是未定義的(盡管我已經在上一個.then()函數中檢查console.log(newFile),並且它始終是一個promise對象。這是什么原因引起的?
調用.then()
時.then()
Promise將解決其他Promise。 因此,盡管您可以從promise 1的函數返回一個字符串,並且可以在其.then()
調用中獲得相同的字符串,但是如果在其函數內返回另一個Promise,則情況並非如此。 相反,它將在給出.then
結果之前將第二個承諾解析為具體值。
因此,如果您調用newFile.then(function(newFileResult) { ...
那么newFileResult
將與您在上述代碼中returnedNewFile
的內容相同,即returnedNewFile
newFileResult
參數。為什么該庫的Promise有時返回一個undefined
值是超越我。
編輯:不是很了解評論,所以一個例子。 我有一個名為getText(str)
的函數,該函數異步檢索該字符串。
response1 = getText("abc").then(ignoredStr => {
return "def";
});
response2 = getText("abc").then(ignoredStr => {
return getText("def");
});
response1.then(function(str1) {
// "def"
});
response2.then(function(str2) {
// "def"
});
在對諾言有一定了解的情況下,str2將是一個Promise
而不是string
; 但事實並非如此。 它看到它返回了一個Promise,而不是一個“ value”,並在鏈接.then()
調用之前等待它。 即使getText(“ def”)在3秒后返回,在給我們.then()
結果之前,它還要等待3秒才能進行第二次調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.