Javascript 运行3个承诺,然后在其他承诺完成后运行最后一个承诺

Javascript 运行3个承诺,然后在其他承诺完成后运行最后一个承诺,javascript,node.js,promise,Javascript,Node.js,Promise,我正在写一个nodejs控制器 我有一整套承诺,其中每个人都从不同的查询中获取数据 我想启动它们(因为它们需要不同的时间来完成),一旦它们全部完成,然后我想启动priceCalc函数,它使用收集的所有数据 我看了很多指南和例子,但我不理解承诺。所有这些,以及它如何在我的情况下工作 另外,如果其中一个失败了,它会返回一个错误吗?它们必须全部完成才能启动priceCalc函数 (我是一个承诺的新手,所以如果可以的话,请尽量简单:-)) 如果您需要所有4个承诺的解析值 var findPrice =

我正在写一个nodejs控制器

我有一整套承诺,其中每个人都从不同的查询中获取数据

我想启动它们(因为它们需要不同的时间来完成),一旦它们全部完成,然后我想启动priceCalc函数,它使用收集的所有数据

我看了很多指南和例子,但我不理解承诺。所有这些,以及它如何在我的情况下工作

另外,如果其中一个失败了,它会返回一个错误吗?它们必须全部完成才能启动priceCalc函数

(我是一个承诺的新手,所以如果可以的话,请尽量简单:-))


如果您需要所有4个承诺的解析值

var findPrice = new Promise(
    (resolve, reject) => {
    priceTable.findOne........

var movePrice = function (data) {
    priceArray = data......

var findhotdeal = new Promise(
    (resolve, reject) => {
    hotdealTable.aggregate.........

var movehotdeal = function (data) {
    hotdealArray = data;.......     

var calculatePrice = function ([fp, mp, fh, mh]) {
    // fp == resolved value of findPrice
    // mp == resolved value of movePrice
    // fh == resolved value of findhotdeal
    // mh == resolved value of movehotdeal
}

Promise.all([findPrice, findPrice.then(movePrice), findhotdeal, findhotdeal.then(movehotdeal)])
    .then(calculatePrice)
    .catch(err => { /* handle errors here */})
注:

是ES2015+的缩写吗

var calculatePrice = function (r) {
    var fp = r[0],
        mp = r[1],
        fh = r[2],
        mh = r[3];

    // fp == resolved value of findPrice
    // mp == resolved value of movePrice
    // fh == resolved value of findhotdeal
    // mh == resolved value of movehotdeal
}
鉴于movePrice和movehotdeal不是异步的


如果您需要所有4个承诺的解析值

var findPrice = new Promise(
    (resolve, reject) => {
    priceTable.findOne........

var movePrice = function (data) {
    priceArray = data......

var findhotdeal = new Promise(
    (resolve, reject) => {
    hotdealTable.aggregate.........

var movehotdeal = function (data) {
    hotdealArray = data;.......     

var calculatePrice = function ([fp, mp, fh, mh]) {
    // fp == resolved value of findPrice
    // mp == resolved value of movePrice
    // fh == resolved value of findhotdeal
    // mh == resolved value of movehotdeal
}

Promise.all([findPrice, findPrice.then(movePrice), findhotdeal, findhotdeal.then(movehotdeal)])
    .then(calculatePrice)
    .catch(err => { /* handle errors here */})
注:

是ES2015+的缩写吗

var calculatePrice = function (r) {
    var fp = r[0],
        mp = r[1],
        fh = r[2],
        mh = r[3];

    // fp == resolved value of findPrice
    // mp == resolved value of movePrice
    // fh == resolved value of findhotdeal
    // mh == resolved value of movehotdeal
}
鉴于movePrice和movehotdeal不是异步的


原始承诺

我很高兴看到你已经了解了承诺。所有这些,但我认为重要的是,你可以思考承诺是如何运作的,并理解你可以自己构建这些东西

你的原始标准

我有一整套承诺,其中每个人都从不同的查询中获取数据

我想启动它们(因为它们需要不同的时间来完成),一旦它们全部完成,然后我想启动priceCalc函数,它使用收集的所有数据

我们希望我们的代码如下所示

all(arrayOrPromises)
  .then(values => onSuccess(values), err => onFailure(err))
我将首先实现
all
,并对其进行一点解释。然后,我将介绍另外两个助手来构建一个演示,以确保一切都按预期进行

因此,直观地说,
all
接受承诺数组,并返回解析值数组的承诺

我们首先要回报一个承诺。当给定一个包含N个承诺的输入数组时,我们知道需要解析N个承诺才能最终解析
all
返回的承诺。因此,我们所做的就是为解析值(
结果
)创建一个容器,在存储解析值的每个承诺中附加一个
,然后再附加一个
。然后
检查我们是否能最终解析
结果
——当
挂起
0时,没有更多悬而未决的承诺,因此现在是解决问题的时候了。最后,我将在每个承诺后附加一个
.catch
,以便在任何承诺失败时立即拒绝外部承诺


演示助手

为了构建一个演示,我们需要创建一系列承诺,这些承诺需要花费随机的时间来完成。当然,您的代码将调用返回承诺的实际函数,因此这只是一个模拟–我之所以包含这些函数,是因为
all
可以作为一个独立的演示在这里展示

// fakeP :: a -> Promise a
const fakeP = x =>
  Promise.resolve(x)
    .then(log('start'))
    .then(wait(rand(5000)))
    .then(log('end'))
fakeP
以“假”延迟(随机0-5秒)做出承诺。为了增加可视化效果,
fakeP
还将在承诺开始和结束时记录


原始承诺

我很高兴看到你已经了解了承诺。所有这些,但我认为重要的是,你可以思考承诺是如何运作的,并理解你可以自己构建这些东西

你的原始标准

我有一整套承诺,其中每个人都从不同的查询中获取数据

我想启动它们(因为它们需要不同的时间来完成),一旦它们全部完成,然后我想启动priceCalc函数,它使用收集的所有数据

我们希望我们的代码如下所示

all(arrayOrPromises)
  .then(values => onSuccess(values), err => onFailure(err))
我将首先实现
all
,并对其进行一点解释。然后,我将介绍另外两个助手来构建一个演示,以确保一切都按预期进行

因此,直观地说,
all
接受承诺数组,并返回解析值数组的承诺

我们首先要回报一个承诺。当给定一个包含N个承诺的输入数组时,我们知道需要解析N个承诺才能最终解析
all
返回的承诺。因此,我们所做的就是为解析值(
结果
)创建一个容器,在存储解析值的每个承诺中附加一个
,然后再附加一个
。然后
检查我们是否能最终解析
结果
——当
挂起
0时,没有更多悬而未决的承诺,因此现在是解决问题的时候了。最后,我将在每个承诺后附加一个
.catch
,以便在任何承诺失败时立即拒绝外部承诺


演示助手

为了构建一个演示,我们需要创建一系列承诺,这些承诺需要花费随机的时间来完成。当然,您的代码将调用返回承诺的实际函数,因此这只是一个模拟–我之所以包含这些函数,是因为
all
可以作为一个独立的演示在这里展示

// fakeP :: a -> Promise a
const fakeP = x =>
  Promise.resolve(x)
    .then(log('start'))
    .then(wait(rand(5000)))
    .then(log('end'))
fakeP
以“假”延迟(随机0-5秒)做出承诺。为了增加可视化效果,
fakeP
还将在承诺开始和结束时记录


我想说您需要类似于
Promise.all(arrayOfPromises)的东西。然后((results)=>{doThingsWithResults})
-如果任何一个“arrayofpromise”失败,那么将不会调用.then(您需要
.catch
来处理错误)@JaromandaX那么,我如何确保每个承诺的所有步骤都得到遵守呢?`我不太确定数组的所有步骤都会是什么样子?那么你需要findPrice、movePrice、findhotdeal和movehotdeal的结果吗?@JaromandaX是的
// eg
fakeP(1).then(console.log, console.error)
// start 1
// <random delay>
// end 1
// 1