Promise.all - 在错误的时间运行?

时间:2018-04-09 15:36:25

标签: javascript node.js amazon-web-services angular-promise

我似乎无法让Promise.all按照我认为的那样运作。

从日志中可以看出,“Streak”和“Last Activity”等数据的承诺已成功填写到最后。但是我希望Promise.all只在所有内容都被填充时才获取数据,当它在一切未定义的时候调用一次。

第一次使用promises,所以非常感谢任何建议!

function buildResponse (UserId, weekNumber, yesterday, today, lastLogin) {
let currentStreak;
let getLastActivity;
let weekExercise;
let dayTotal;
let yesterdayTotal;

getUserData(UserId);
getUserData(UserId).then((data) => {
if (!data.Item || !data.Item.UserId) {
  console.log("Get User Data Not Found");
} else {
  currentStreak = data.Item.streak;
  getLastActivity = data.Item.lastActivity;
  console.log("Streak is: " + currentStreak);
  console.log("Last activity is: " + getLastActivity);
}
});
getUserData(UserId).catch((err) => {
console.log("Get week data error " + err);
});

getWeekData(UserId, weekNumber);
getWeekData(UserId, weekNumber).then((data) => {
if (!data.Item || !data.Item.UserId) {
  console.log("Week Data Not Found");
} else {
  var yesterdayDay = "Monday";
  weekExercise = data.Item.weekTotal;
  dayTotal = data.Item.Monday;
  yesterdayTotal = data.Item[yesterdayDay];
  console.log("Days total is: " + dayTotal)
}
});
getWeekData(UserId, weekNumber).catch((err) => {
console.log("Get week data error " + err);
});

Promise.all([getWeekData(UserId, weekNumber), getUserData(UserId)]).then((data) => {
console.log("Promise all: " + dayTotal + " and " + currentStreak + " and " + getLastActivity);
});
}

获取用户数据:

function getUserData(UserId) {
  const docClient = new AWS.DynamoDB.DocumentClient();
  const params = {
    TableName: "XXXXXXXX",
    Key: {
      "UserId": UserId,
    }
  };

  return docClient.get(params).promise();
}

记录是:

    2018-04-09T15:18:35.348Z    43df7459-3c09-11e8-b44c-1726d06a9efd Promise all: undefined and undefined and undefined
 2018-04-09T15:18:35.366Z   43df7459-3c09-11e8-b44c-1726d06a9efd    Update last 
    login succeeded: {
    "Attributes": {
    "lastLogin": "2018-04-09"
    }
    }
    2018-04-09T15:18:35.387Z    43df7459-3c09-11e8-b44c-1726d06a9efd    Streak is: 0
    2018-04-09T15:18:35.405Z    43df7459-3c09-11e8-b44c-1726d06a9efd    Last activity is: run
    2018-04-09T15:18:35.406Z    43df7459-3c09-11e8-b44c-1726d06a9efd    Reset Streak succeeded: {
  "Attributes": {
    "streak": 0
  }
}
    2018-04-09T15:18:35.426Z    43df7459-3c09-11e8-b44c-1726d06a9efd    Days total is: 768

编辑[09/04/2018]

再次运行它,这次两个承诺被填满,但其中一个没有。有关添加内容的任何建议,以确保Promise.all等待所有内容都填满?

2018-04-09T15:41:19.427Z    710113a9-3c0c-11e8-a906-cb494b7c4b47    Streak is: 0
2018-04-09T15:41:19.445Z    710113a9-3c0c-11e8-a906-cb494b7c4b47    Last activity is: run
2018-04-09T15:41:19.448Z    710113a9-3c0c-11e8-a906-cb494b7c4b47    Promise all: undefined and 0 and run
2018-04-09T15:41:19.486Z    710113a9-3c0c-11e8-a906-cb494b7c4b47    Update last login succeeded: {
  "Attributes": {
    "lastLogin": "2018-04-09"
  }
}
2018-04-09T15:41:19.486Z    710113a9-3c0c-11e8-a906-cb494b7c4b47    Days total is: 128
2018-04-09T15:41:19.506Z    710113a9-3c0c-11e8-a906-cb494b7c4b47    Reset Streak succeeded: {
  "Attributes": {
    "streak": 0
  }
}
END RequestId: 710113a9-3c0c-11e8-a906-cb494b7c4b47
REPORT RequestId: 710113a9-3c0c-11e8-a906-cb494b7c4b47  Duration: 2008.58 ms    Billed Duration: 2100 ms    Memory Size: 128 MB Max Memory Used: 38 MB  

1 个答案:

答案 0 :(得分:1)

不要违背Promises的好处!在多个地方你可以这样做:

 getUserData(UserId).then((data) => {
    // This line is executed *somewhen* when the data is found
    // The below line is the real problem:
    currentStreak = data.Item.streak;
 });

那就错了!您不应该将数据传递到promises then处理程序之外。而是将依赖于它的代码放入 then处理程序,以便它能够在那里访问它,并且所有异步代码问题都消失了:

  Promise.all(getUserData(UserId),  getWeekData(UserId, weekNumber)).then(([userData, weekData]) => {
    const currentStreak = userData.Item.streak;
    const getLastActivity = userData.Item.lastActivity;

    const yesterdayDay = "Monday";
    const weekExercise = weekData.Item.weekTotal;
    const dayTotal = weekData.Item.Monday;
    const yesterdayTotal = weekData.Item[yesterdayDay];

    /*...*/

 }).catch(/* a proper error handler */);