簡體   English   中英

Javascript承諾鏈接問題(Ember)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM