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