2017-10-09 34 views
1

我有一個函數來調用google語音API。看起來一切都很好,但我無法找到爲什麼它給了我錯誤。我是節點和承諾的初學者,所以不知道爲什麼會出現此錯誤。ReferenceError:解析未定義

ReferenceError: resolve is not defined at index.js:57

的問題是在這部分代碼:

return speech 
    .longRunningRecognize(responses) 
    .then(function(results) { 
     var operation = responses[0]; 
     console.log("Operation: ", operation); 
     return operation.promise(); 
    }) 
    .then(function(responses) { 
     resolve(responses[0]); 
     console.log("Result: ", JSON.stringify(responses[0])); 
    }) 

凡諾

operation.promise() (line 57)

不能得到解決。它想要解決 的承諾,但它看起來像無法找到解析函數。

在谷歌API的工作原理是這樣的:

  • 首先,你做一個API調用來上傳數據並開始處理。
  • 這給你一個操作名稱。
  • 這個名字應該被隨後用來得到結果,當結果準備好(只需要最多30秒)

我有一種感覺它的所有工作,在調用時,響應回來。代碼等待,然後它要解決,但它不能...

我的代碼是這樣的(它的雲功能)

exports.transcribeAudio = functions.storage.object().onChange(event => { 
    const object = event.data; 
    const filePath = object.name; 
    const fileName = filePath.split("/").pop(); 
    const fileBucket = object.bucket; 
    const bucket = gcs.bucket(fileBucket); 
    const tempFilePath = path.join(os.tmpdir(), fileName); 

    // Exit if this is triggered on a file that is not an image. 
    // Get the file name. 
    //const fileName = path.basename(filePath); 
    console.log(filePath + " name: " + fileName); 
    // Exit if the image is already a thumbnail. 
    if (!filePath.startsWith("ucl-flac-audio")) { 
    console.log("Only flac-audio need to be converted"); 
    return true; 
    } 
    // Exit if this is a move or deletion event. 
    if (object.resourceState === "not_exists") { 
    console.log("This is a deletion event."); 
    return true; 
    } 

    return Promise.resolve() 
    .then(() => { 
     const audioFilename = "gs://" + fileBucket + "/" + filePath; 
     console.log(audioFilename); 
     const request = { 
     config: { 
      encoding: "FLAC", 
      languageCode: "fr-FR" 
     }, 
     audio: { 
      uri: audioFilename 
     } 
     }; 

     return speech 
     .longRunningRecognize(request) 
     .then(function(responses) { 
      var operation = responses[0]; 
      console.log("Operation: ", operation); 
      return operation.promise(); 
     }) 
     .then(function(responses) { 
      resolve(responses[0]); 
      console.log("Result: ", JSON.stringify(responses[0])); 
     }) 
     .catch(function(err) { 
      console.error("Failed to get transcript.", err); 
      // reject(err); 
     }); 
    }) 
    .catch(err => { 
     return Promise.reject(err); 
    }); 
}); 
+0

你已經在一個.then回調。只需'返回響應[0]',然後由.then創建的承諾將解析爲該值。 –

+0

btw,這個:'.catch(err => {Promise.reject(err); });'完全沒有意義。只要刪除這些行。 – Thomas

回答

5

你不從.then()處理程序中調用resolve()。這裏沒有定義這樣的功能。如果您想在.then()處理程序中設置已解決的承諾值,則只需返回該值即可。

更改此:

.then(function(responses) { 
     resolve(responses[0]); 
     console.log("Result: ", JSON.stringify(responses[0])); 
}) 

這樣:

.then(function(responses) { 
     console.log("Result: ", JSON.stringify(responses[0])); 
     return responses[0]; 
}) 

僅供參考,的resolve()你可能的想法是一個參數傳遞給新的承諾執行回調:

let p = new Promise(function(resolve, reject) { 
    resolve(10); 
}); 

而且,這是您將在其中使用它的上下文。

+0

謝謝你解釋這個問題!那麼我能否將它寫入谷歌雲存儲?像'返回桶 。文件(文件名) .save(JSON.stringify(響應[0]))或者是異步操作,我應該使用類似返回新的Promise(解析,拒絕)等 – Koen

+0

@ Koen - 我不知道Google API。如果'bucket.file(...)。save(...)'返回一個promise,那麼你可以從'.then()'處理程序中返回它。如果沒有,你需要首先提出。 – jfriend00

+0

@ jsfriend00謝謝!我只是在迴歸中添加了它,現在所有作品都非常漂亮!謝謝 – Koen