0

我有,我需要在结果上表中查询,然后循环和查询循环中另一个表的要求。但我尝试使用同步节点的js模块。但是有时api以这种方法超时错误结束。现在我正在尝试我的代码,但没有运气。AWS拉姆达异步和同步问题

var notification = { 
TableName: "Tablename", 
KeyConditionExpression:"#userId =:userid and #datetime <=:datetime", 
ScanIndexForward: false, 
ExpressionAttributeNames: { 
    "#userId": "userId", 
    "#datetime":"datetime" 
}, 
ExpressionAttributeValues: { 
    ":userid" :userId, 
    ":datetime" :datetime 
} 
}; 

docClient.query(notification, function(err, result) { 

if (err) { 
    context.succeed({success: false, message : JSON.stringify(err, null, 2),method:"notification",type:type}); 
}else{ 

    result = result.Items; 

    if (result.length>0) { 
     for(var i=0;i<result.length;i++){ 
      result[k]['CafeDetail']=getDetail(result[k].CafeID,function (data) { 

      }); 

      if (k ==(result.length -1)) { 
       context.succeed({success: true,data:result, message : "Notification list",method:"notification",type:type}); 
      } 

     } 
    } 

} 

}); 

function getDetail(CafeID,callback) { 
    var param = { 
     TableName: "Tablename", 
     ProjectionExpression:"CafeName,Cafe_MainImage", 
     KeyConditionExpression:"CafeID =:cafeID", 
     ExpressionAttributeValues: { 
      ":cafeID" :CafeID 
     } 
    }; 

    docClient.query(param, function(err, CafeDetail) { 
     if (err) { 
      console.log (err) 
      callback(err); 
     } else { 
      callback(CafeDetail.Items); 
      console.log(CafeDetail.Items); 
     } 
    }); 
} 

在输出这个变量(结果[k] ['CafeDetail'])总是未定义。然而,getDetail函数内的console.log会打印结果。

我是aws lambda节点js新手..任何帮助将不胜感激。

在此先感谢

回答

0

我刚刚解决了我的问题。所以我发布它,可能会帮助别人面临同样的问题

var notification = { 
        TableName: "Tablename", 
        KeyConditionExpression:"#userId =:userid", 
        Limit: 12, 
        ScanIndexForward: false, 
        ExpressionAttributeNames: { 
         "#userId": "userId", 
        }, 
        ExpressionAttributeValues: { 
         ":userid" :userId 
        } 
       }; 

       docClient.query(notification, function(err, result) { 
        if (err) { 
         context.succeed({success: false, message : JSON.stringify(err, null, 2),method:"notification",type:type}); 
        }else{ 
         var ret =[]; 
         var results =result.Items; 
         if (results.length>0) { 
          results.forEach(function(result, i) { 
           console.log(i); 
           var param = { 
            TableName: "Tablename", 
            ProjectionExpression:"CafeName,Cafe_MainImage", 
            KeyConditionExpression:"CafeID =:cafeID", 
            ExpressionAttributeValues: { 
             ":cafeID" :result.CafeID 
            } 
           }; 

           docClient.query(param, function(err, CafeDetail) { 
            if (err) { 
             context.succeed({success: false, message : JSON.stringify(err, null, 2),method:"notification",type:type}); 
            } else { 
             console.log(CafeDetail.Items); 
             CafeDetail =CafeDetail.Items; 
             result['CafeDetail']=CafeDetail 
             console.log(result); 
             if (i === results.length -1) { // last iteration 
              context.succeed({success: true,data:results, message : "Notification list",method:"notification",type:type}); 
             } 
            } 
           }); 
          }); 
         }else{ 
          context.succeed({success: true,data:result, message : "Notification list",method:"notification",type:type}); 
         } 
        } 
       });