Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何让这个节点等待工作完成?_Javascript_Node.js_Aws Lambda - Fatal编程技术网

Javascript 如何让这个节点等待工作完成?

Javascript 如何让这个节点等待工作完成?,javascript,node.js,aws-lambda,Javascript,Node.js,Aws Lambda,我是nodejs的新手 我有一个AWS lambda,它读取队列并在处理消息后删除它们: const AWS = require('aws-sdk'); AWS.config.logger = console; const sqs = new AWS.SQS({apiVersion: '2012-11-05'}); const redriveQueueUrl = 'https://myqueue"; async function deleteMessage (messageToDelete)

我是nodejs的新手

我有一个AWS lambda,它读取队列并在处理消息后删除它们:

const AWS = require('aws-sdk');
AWS.config.logger = console;
const sqs = new AWS.SQS({apiVersion: '2012-11-05'});
const redriveQueueUrl = 'https://myqueue";

async function deleteMessage (messageToDelete) {
    let params = {
        QueueUrl: redriveQueueUrl,
        ReceiptHandle: messageToDelete.ReceiptHandle
    };
    sqs.deleteMessage(params, function (err, data) {
        if (err) console.log(err, err.stack);
        else console.log(data);
    });
}


exports.handler = async (event) => {

    var params = {
        QueueUrl: redriveQueueUrl,
        MaxNumberOfMessages: '2',

    };
    let sqsResponse = await sqs.receiveMessage(params).promise();
    let messages = sqsResponse.Messages

    for (let index in messages) {
        // do something here later.
        await deleteMessage(messages[index]);
    };

    const response = {
        statusCode: 200,
        body: JSON.stringify('End of Lambda!'),
    };
    return response;
};
此代码正确读取给定队列,但不删除任何消息。
如何解决此问题?

sqs.deleteMessage
需要返回承诺。否则调用
wait sqs.deleteMessage()
将立即返回

试试这个:

async function deleteMessage (messageToDelete) {
    let params = {
        QueueUrl: redriveQueueUrl,
        ReceiptHandle: messageToDelete.ReceiptHandle
    };
    return new Promise((resolve, reject)=>{
      sqs.deleteMessage(params, function (err, data) {
          if (err) return reject(err);
          else return resolve(data);
      });
    })
}

我估计您的
sqs.deleteMessage
函数也是异步的,但是您没有将
wait
放在它前面。因此,它将无需等待即可运行。