2017-07-11 47 views
1

我有一個在節點環境中完美運行的功能。該函數使用promise,S3調用和then和catch使用相關的200/500 statusCode和每個消息體中的消息體呼叫回調。AWS Lambda無需等待承諾即可返回

現在我部署它作爲一個包裝lambda函數圍繞它看起來像這樣:

module.exports.getAvailableDates = (event, context, callback) => { 
    const lambdaParams = retrieveParametersFromEvent(event); 
    console.log(`Got the criteria`); 
    module.exports.getFilteredDates(lambdaParams.startDate, 
           lambdaParams.endDate, callback); 
    console.log(`Returning without the internal function results`); 
}; 

內部功能如下:

module.exports.function getFilteredDates(startDate, endDate) { 
    const dateSet = new Set(); 
    return new Promise((resolve, reject) => { 
    const getAllDates = (isDone) => { 
     if (isDone) { 
     const Dates = Array.from(dateSet).join(); 
     resolve(Dates); 
     return; 
     } 
     getTestedDates(startDate, endDate, region, func, memory, 
     lastDateKey, dateSet).then(getAllDates).catch((error) => { 
      reject(error); 
     }); 
    }; 
    lastDateKey = ''; 
    getTestedDates(startDate, endDate, region, func, memory, 
     lastDateKey, dateSet).then(getAllDates).catch((error) => { 
     reject(error); 
     }); 
    }); 
} 

而且甚至更多的內部函數如下類似,只有它實際上查詢S3數據庫並返回匹配日期標準的密鑰列表。

在AWS CloudWatch日誌中,我看到兩個打印並僅在它們之後顯示內部函數輸出。我的理解是,lambda函數並沒有等待內部函數的承諾實際完成其工作(包括內部等待承諾),並返回給我一個不好的地位。我能做什麼?

+0

ü可以分享你的'promise'代碼 –

回答

0

在執行callback之前執行了最後的console.log

如果你想剛出LAMBDA提前打印完整的陳述,你需要用的callback廣告等待承諾完成:

import getFilteredDates from '../path/to/file'; 

module.exports.getAvailableDates = (event, context, callback) => { 
    const lambdaParams = retrieveParametersFromEvent(event); 
    console.log(`Got the criteria`); 
    getFilteredDates(lambdaParams.startDate,lambdaParams.endDate) 
    .then(result => { 

    console.log(`Returning the internal function results`); 
    return callback(); 
    }) 
    .catch(callback); 
}; 

我已經更新代碼與給定的承諾合作下面的功能。

getFilteredDates需要被重新塑造了一下:

  • 要麼你有一個第三個參數中接受回調和處理無極鏈內部
  • 或者你揭露一個承諾和外部處理回調在主要範圍內。

讓我們重構它只是返回一個承諾和處理外回調:

function getFilteredDates(startDate, endDate) { 
    const dateSet = new Set(); 
    return new Promise((resolve, reject) => { 
     const getAllDates = (isDone) => { 
     if (isDone) { 
      const Dates = Array.from(dateSet).join(); 
      resolve(Dates); 
      return; 
     } 
     getTestedDates(startDate, endDate, region, func, memory, 
      lastDateKey, dateSet).then(getAllDates).catch((error) => { 
      reject(error); 
     }); 
    }; 
    lastDateKey = ''; 
    getTestedDates(startDate, endDate, region, func, memory, 
     lastDateKey, dateSet).then(getAllDates).catch((error) => { 
     reject(error); 
    }); 
    }); 
} 
module.exports = getFilteredDates; 
+0

我覺得TOT另一個錯誤我們中的一個。我的問題不是打印,而是lambda正在返回而不等待回調,這是在我的內部getFilteredDates函數中調用的。 –

+0

嗨馬可, 像以前一樣 - 這在我的節點(本地)中工作,但不是在部署爲lambda時。非常奇怪... –

+0

是否使用節點sdk,其中承諾不受支持? –

0

OK,理解了它,這是我不好。當返回200(成功)並且一次又一次失敗的lambda時,使用狀態代碼調用回調的內部函數沒有null。無論如何,我重寫我的拉姆達是:

module.exports.getAvailableDates = (event, context, callback) => { 
    const lambdaParams = retrieveParametersFromEvent(event); 
    getFilteredDates(lambdaParams.startDate, lambdaParams.endDate) 
    .then(Dates => callback(null, { statusCode: 200, body: Dates})) 
    .catch(error => callback({ statusCode: 500, body: error})); 
}; 

現在它工作正常。感謝任何試圖幫助的人!

奧倫