CosmosDB存储过程-答应而不是回调

5 javascript asynchronous stored-procedures azure-cosmosdb

是否可以在CosmosDB(DocumentDB)存储过程API调用中使用JavaScript Promise代替常规回调?一种用法是实现分页。

例如

token = getToken();
doSomething(token);    

//....
function getToken(....) {   

  //...
  collection.queryDocuments(link, query, queryOptions, function(error, documents, responseOptions) {
    return responseOptions.continuation;
  });
}
Run Code Online (Sandbox Code Playgroud)

将不起作用,因为令牌是在回调中返回的,并且执行继续。您能否举例说明如何实现此目的?

小智 4

Cosmos DB 文档中引用的 ECMAScript 版本支持 async/await 和 Promises。我可以在我的存储过程中使用这两个。

这是一个返回进行参数化文档查询的承诺的函数:

function queryDocumentsAsync(sql, parameters, options) {
    const querySpec = {
        query: sql,
        parameters: parameters
    };

    return new Promise((resolve, reject)=>{
        let isAccepted = __.queryDocuments(__.getSelfLink(), querySpec, options || {}, (err, feed, options) => {
            if(err) reject(err);
            resolve({
                feed: feed,
                options: options
            });
        });
        if(!isAccepted) throw "Query was not accepted.";
    });
}
Run Code Online (Sandbox Code Playgroud)

不过,我发现使用这种方法强制回滚存在一些限制。如果你抛出一个错误,它就会被承诺链吞没并且永远不会出去。