簡體   English   中英

Azure Cosmos數據庫和功能JavaScript SDK-如何讀取異步文件?

[英]Azure Cosmos db and functions javascript sdk - how to read document async?

我在阿波羅解析器中有以下代碼:

Mutation: {
    addChannel: (root, args) => {
      client.readDocument("website", {}, (x) => {
        return { id: "Test", name: "Test Channel " + args.name }
      });
    },

客戶是文檔客戶:

var DocumentClient = require('documentdb').DocumentClient;

調用它時,我想等待client.readDocument完成並給我返回的返回值(上面的示例非常簡單,不會這樣做)

我的問題是readDocument在后台異步執行某項操作,但該函數未同步,因此我無法等待,因此該函數在回調有機會完成之前立即掉線。 發送返回數據(未定義)后,將發生回調函數(x)=> {...}。

我在這里可以想到的三種解決方案(要使用哪種解決方案取決於您的實際情況):

  1. Cosmos DB API的v2具有異步/等待支持,因此您可以使用它代替回調。
  2. 將回調代碼包裝在Promise中,然后等待Promise。
  3. 使用非異步Azure函數,並在回調結束時返回帶有context.done(result)context.done(result)

我建議您轉向Java API的v2版本: https : //github.com/Azure/azure-cosmos-js

這樣,您可以使用流暢的items路徑,並使用const { body: readDoc } = await item.read(); 讀取異步項目。

您可以在此處找到有關如何完成此操作的多個示例

您的代碼的性質與readDocument遵循的回調模型不匹配,因此您沒有機制將文檔從addChannel傳遞回。

假設您不需要事先對文檔進行任何預處理,則可以結合使用promises和async / await語法,例如

addChannel: (root, arg) => 
  new Promise((resolve, reject) => 
    client.readDocument("website", {}, (err, x) => 
      err ? reject(err) : resolve(x)
    )
  );
}

然后在執行其他代碼之前先“等待”文檔

const doc = await obj.addChannel(...);
// use doc

注意- await只能在標記為async的函數中使用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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