javascript - 使用 Promise 和 async 进行 protobufjs 加载调用
问题描述
我试图找出重写以下代码的最佳方法:
var api = function(id, contract) {
var callback = function (error, root) {
if (error)
throw error;
var by = Buffer.from(contract,'base64')
var es = root.lookupType("Contract")
var esMsg = es.decode(by)
var esBytes = es.encode(esMsg).finish()
signature = id.sign(esBytes).toString('base64')
}
return new Promise((resolve, reject) => {
protobuf.load("contract.proto", callback)
})
}
var signContract = async(privateKey, contract) => {
let signature
var id = await crypto.keys.unmarshalPrivateKey(Buffer.from(privateKey, 'base64'))
result = await api(id,contract,signature)
}
function getSessionSignature (hash, time) {
return config.id + ":" + hash + ":" + time
}
module.exports = configure(({ ky }) => {
return async function * signbatch (input, options) {
var contracts = input.Contracts
for (var i = 0 ; i < contracts.length ; i++) {
contracts[i].contract = await signContract(config.PrivKey, contracts[i].contract)
}
//add signed contracts to the searchParams
searchParams.append("arg", JSON.stringify(contracts))
let res
res = await ky.post('storage/upload/signbatch', {
searchParams
}).json()
yield JSON.stringify({})
} else {
yield JSON.stringify({error:"Private key not found"})
}
}
})
我的问题是如何编写签名异步代码以将 privateKey 和 contract 变量传递给 api var 函数并将签名返回给要分配给 contracts[i].contract 的结果变量?请注意,id.sign(..) 函数是回调函数内部的 Promise。
解决方案
您需要解决 api 函数中的承诺,文档建议您可以在此处使用单参数变体,例如
var root = await protobuf.load("contract.proto");
... // (The code you currently by have in 'callback'
return signature;
由于生成器是async
,yield 将发出一个Promise
您可以(显然)使用.then
或处理的await
推荐阅读
- db2 - 发生连接授权失败。原因:GSSAPI 服务器凭据无效。错误代码=-4214,SQLSTATE=28000
- javascript - 如何分配或获取工作空间的父文件夹路径和工作空间文件夹的父文件夹名称
- sqlite - 在 Firedac Sqlite 数据库连接上插入后如何进行事件?
- php - 我想通过分页每页显示一篇文章。但是分页按钮不起作用
- c - 如何在 VxWorks 中为特定套接字 fd(非系统范围)设置 TCP 保持活动间隔?
- android - Android Fragment 返回菜单活动
- symfony - 如何在 Symfony 4 中设置相似和不相似?
- java - Android 应用在运行时自行更改语言
- r - 如何在两个数据表之间提取具有特定列和值的行?
- javascript - Javascript中的拆分函数不适用于对象中的字符串