你如何使用javascript promisestring中的.then函数中的参数调用函数?

我正在将使用node.js编写的AWS lambda函数转换为使用promise而不是callback函数。 我用处理程序代码将所有的函数包装在处理程序中。 我试图打破简单的function,所以我可以在处理程序代码中尽可能平坦的承诺链。

我卡在一个点,我有一个.then(),返回一个值,我需要传递给我的一个函数,这已被promisified,以及其他参数。 我search了高和低,但找不到这样做的语法的一个例子。 我甚至不知道我在做什么是正确的。 我发现的所有文章都解释了简单的承诺链,只通过.then()方法返回一个值。 没有一个能够将其转化为另一个function。

以下是我到目前为止:

var bbPromise = require("./node_modules/bluebird"); var AWS = require("./node_modules/aws-promised"); var rp = require("./node_modules/request-promise"); var moment = require('./node_modules/moment.js'); var dynamodb = new AWS.dynamoDb(); exports.handler = function(event, context) { "use-strict"; // This gets a token that will be used as a parameter for a request function getToken(params){ return rp.post({ url: "https://api.something.com/oauth2/token", followRedirects: true, form: params, headers: {'Content-Type': 'application/x-www-form-urlencoded'} }).then(function(body){ return JSON.parse(body).access_token; }).catch(function(error){ console.log("could not get token: "+error); }); } function getData(userId, db, token){ var qParams = { // params that will get one record }; return dynamodb.queryPromised(qParams) .then(function (data){ var start_date = // did some date manipulation on data to get this value // Request records, passing the token in the header var url = "https://api.something.com/data/?db="+db+"&start_date="+start_date; var headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization':'Bearer '+token }; tokenParams = {all the parameters}; rp.get({ url:url, qs:tokenParams, headers:headers, followRedirect: true }).then(function(body){ return body; }).catch(function(error){ console.log("could not get data: "+error); }); }).catch(function(error){ console.log("Final Catch - getData failed: "+error); }); } // THIS IS WHERE THE HANDLER CODE STARTS // Get an array of all userIds then get their data dynamodb.scanPromised({ // params that will get the user Ids }).then(function(users){ for(var i=0; i<users.length; i++){ userId = // the value from the user record; // Request a token var tokenParams = {an object of params}; getToken(tokenParams) .then(function(token){ ///////////// THIS IS WHERE I NEED HELP ///////////////// /* Is there a way to pass getData the token within the .then() so I don't have a nested promise? */ getData(userId, users[i].dbName, token) ////////////////////////////////////////////////////////// }).catch(function (e){ console.log("caught an error"); }); } }).catch(function (e){ console.log("caught an error"); }); }; 

你可以使用Promise.all() .then()Function.prototype.bind() ; 从getData() return rp.get() getData()

  return Promise.all(users.map(function(user) { userId = // the value from the user record; // Request a token var tokenParams = { an object of params }; return getToken(tokenParams) .then(getData.bind(null, userId, user.dbName)) .catch(function(e) { console.log("caught an error"); throw e }); })) 

使用承诺时,您的代码应该看起来更像这样。

 when.try(() => { return api.some_api_call }) .then((results) => { const whatIAmLookingFor = { data: results.data }; someFunction(whatIAmLookingFor); }) .then(() => { return api.some_other_api_call }) .then((results) => { const whatIAmLookingFor = { data: results.data }; someOtherFunction(whatIAmLookingFor); .catch(() => { console.log('oh no!'); }) });