我正在使用aws的dbclient.scan函数从dynamodb中检索数据。我需要使用输出数据从另一个表中检索数据。我试图将第一个db扫描的输出分配给dbclient.scan之外的变量。问题是,当我从dbclient.scan回调函数分配数据时,我得到空变量。我该怎么办?无论如何,我还没有使用承诺和异步概念。以下是我写的代码。
var tmp = []
docClient.scan(params, (error, result) => {
if(error) { .......}
else{ var tmp1 = result.Items[0].data
tmp.push(tmp1)
}
});
console.log(tmp)//empty list
我该怎么办? 非常感谢, 海
答案 0 :(得分:0)
我发现这是最简单的方法,如下所示:
let request = new AWS.DynamoDB({apiVersion: '2012-08-10'})
let params = {
TableName: 'YOUR_TABLE_NAME',
Key: {
'YOUR_KEY': { S: 'STRING_VALUE_TO_MATCH' }
}
}
let result = await request.getItem(params).promise().then((data) => {
return data.Item
})
// Now you can use result outside of the promise.
console.log(JSON.stringify(result))
确保此函数位于异步函数中,并且对您有效。这不是为了“扫描”,但概念应该相同。
答案 1 :(得分:-1)
直到有人向我展示了一种明智的方法,并通过真实的代码示例,这种方法通常可以正常工作:
public function listFitters(Request $request)
{
// Get Entity manager and repository
$em= $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
//set required role
$role = 'ROLE_FITTER';
$qb->select('u')
->from('userBundle:User', 'u')
->where('u.roles LIKE :roles')
->setParameter('roles', '%"' . $role . '"%');
$user = $qb->getQuery()->getResult();
// Serialize into an array the data that we need, in this case only name and id
$responseArray = array();
foreach ($users as $user) {
$responseArray[] = array(
"id" => $user->getId(),
"name" => $user->getName()
);
}
// Return array for dropdown
return new JsonResponse($responseArray);
}
答案 2 :(得分:-2)
您误解了Javascript和回调的工作原理。 Javascript将立即自上而下处理整个文件。因此,当您执行console.log(tmp)
时,上面的DynamoDB扫描尚未完成。
尝试将代码更改为以下内容以查看DynamoDB中的数据:
var tmp = []
docClient.scan(params, (error, result) => {
if(error) { .......}
else {
var tmp1 = result.Items[0].data
tmp.push(tmp1)
// now get item using results from scan
var params = {
TableName: "mytable",
Key: {
KeyName: tmp1.KeyName
}
}
docClient.get(params, (error, results) => {
console.log(results)
})
}
});
我强烈建议您查看async / await(Google results for tutorials)。这将使您在处理嵌套回调时更加轻松。