Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将承诺函数推送到数组中。使用Promise.all。许下承诺要尽早做出决定

将承诺函数推送到数组中。使用Promise.all。许下承诺要尽早做出决定
EN

Stack Overflow用户
提问于 2019-12-13 04:32:23
回答 3查看 1.7K关注 0票数 0

我对Node.js很陌生。我对承诺函数和Promise.all有一个问题。

要么我误解了某个概念,要么我做错了什么。我试着研究这个问题,但没有找到正确的答案。

情况如下。

  • I有一个生成pdf的承诺函数,它返回生成的pdf的路径。

变量dataBase.fetchForId(customerId).then(function(data){ myNicePdfCreator={ setting1: value1,setting2: value2,createPdf: function(customerId){返回新承诺(函数(解析,拒绝)){setting1 somePdfLibrary.createPdf.then(函数(路径)){解析(路径);},函数(Err){//错误创建pdf拒绝(Err);};},函数(Err){//错误从db拒绝(Err)中提取;}

  • I有一个承诺函数,它接收电子邮件地址和路径到pdf,然后发送带有所附pdf的电子邮件

var myNiceMailSender={ setting1: value1,setting2: value2,sendMail: function(email,path){返回新承诺(函数(解析,拒绝){someMailLibrary.createMail(电子邮件,标题,消息,附件)).then(状态){解析(状态);},函数(Err){拒绝(Err);};} }

我希望对数组中的每个对象都这样做(例如,为每个客户获取一份报告,然后通过电子邮件发送给他们)。我试图想出一个承诺函数,它首先创建pdf,然后发送邮件,然后使用forEach循环将承诺推送到数组,然后使用Promise.all制作所有pdf并发送邮件。但是无论我尝试什么,每当我向数组推送承诺时,它都在我使用Promise.all之前就已经被解析了,即使我只是尝试将这两个承诺函数中的一个推到数组中。

如果我这样做;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var promises=[];
    AllCustomers.forEach(customer){
     promises.push(myNicePdfCreator.createPdf(customer.id));
    });

当我将PDF推送到数组时,会直接创建PDF。我甚至不需要打电话给Promise.all

同样,如果我试图将承诺函数推送到发送电子邮件的数组中,邮件就会立即发送。

有人能为我指出正确的方向吗?为什么我的承诺在我把它们推到数组中时会被解决?

是否有更好的方法来创建PDF然后发送电子邮件?

任何帮助,谢谢!

EN

回答 3

Stack Overflow用户

发布于 2019-12-13 05:53:37

我想你想要的是在你开始发送电子邮件之前把所有的pdfs都读出来。正如有人已经说过的,当你调用一个承诺,除非你有一个.then或等待它,它的执行是不会等待的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const promises=[];
for(const customer of AllCustomers){
  promises.push(myNicePdfCreator.createPdf(customer.id));
});
Promise.all(promises).then((paths) => {
   // paths is going to have an array with the paths of all the pdfs already generated
});

使用此代码,在Promise.all中将等待生成所有pdfs。所以在那个时候,你可以发邮件。

票数 1
EN

Stack Overflow用户

发布于 2019-12-13 05:57:32

如果您想要创建一系列未解决的、未处理的承诺,为每个客户创建一个报告,然后发送电子邮件给该客户,则如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const pfuncs = AllCustomers.map(customer => {
  return async function() {
    const pdfPath = await myNicePdfCreator.createPdf(customer.id);
    const status = await myNiceMailSendor.sendMail(customer.email, pdfPath);
    return {status, pdfPath};
  }
})

这将创建一个函数数组--“createPdf”请求尚未开始运行,它正在等待您调用数组中的每个函数。

当你准备好发送请求时,你会

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const results = await Promise.all(pfuncs.map(f => f()));

现在结果是一个看起来像[{status: 200, pdfPath: ''} , {status: 200, pdfPath: ''}, ...]的数组

票数 1
EN

Stack Overflow用户

发布于 2019-12-13 06:02:16

承诺在声明时被执行。如果您想要“锁定”所有的承诺,直到所有的承诺都定义好为止,您可以将其封装在一个函数中,并且在声明完所有的承诺之后,创建一个循环来执行它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Await "a" seconds to finish, reject if "a" o "b" are negative
function myPromiseFunction(a, b) {
    return new Promise((res, rej) => {
        setTimeout(() => {
            if (a < 0 || b < 0) {
                rej(0);
            } else {
                res(a+b);
            }
        }, a * 1000);
    })
}

(() => {
    let someData = [{a:2,b:2}, {a:10, b:4}];

    // Generate promises in functions
    let myPromises = someData.map((v) => {
        return () => myPromiseFunction(v.a, v.b);
    });

    // Execute all
    myPromises = myPromises.map((promise) => promise());

    // ...
})();

Promise.all函数只等待完成过程的所有承诺,否则任何承诺都会被拒绝。例如:

所有的承诺都是好的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Await "a" seconds to finish, reject if "a" o "b" are negative
function myPromiseFunction(a, b) {
    return new Promise((res, rej) => {
        setTimeout(() => {
            if (a < 0 || b < 0) {
                rej(0);
            } else {
                res(a+b);
            }
        }, a * 1000);
    })
}

(() => {
    let someData = [{a:2,b:2}, {a:10, b:4}];

    // Generate promises in functions
    let myPromises = someData.map((v) => {
        return () => myPromiseFunction(v.a, v.b);
    });

    // Execute all
    myPromises = myPromises.map((promise) => promise());

    // Await all
    Promise.all(myPromises).then(res => {
        console.log(res, myPromises);
    }).catch(err => {
        console.log(err, myPromises);
    });
})();

您将在console.log中打印then,并将如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// res: [ 4, 14 ]
// myPromises: [ Promise { 4 }, Promise { 14 } ]

但如果你有一个像这样失败的承诺:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let someData = [{a:10,b:2}, {a:4, b:-4}, {a:2, b:4}];

第二个承诺将被负值拒绝,但第一个承诺不会被解析(10秒结束),因此捕获的输出将是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// err: 0 (this is the error of the first rejected promise)
// myPromises: [ 
//     Promise { <pending> }, // The rejected promise will not stop the pendings
//     Promise { <rejected> 0 }, // The rejected promise
//     Promise { 6 }, // A "resolved" or maybe "pending"
// ]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59322704

复制
相关文章
Remove China Apps凉了?作死的阿三们并没有罢休
近日,一款名为『Remove China Apps』的应用,在印度火了,上架2周,下载量500W+,日均下载量超过20W,登上了Google PlayStore印度地区排行榜榜首,而TikTok(抖音国际版)仅位居第4。这款应用的功能,已经写得很明目张胆了——卸载中国应用。
Android扫地僧
2020/06/09
6020
正常的工作流程
修改文件,将它们更新的内容添加到索引中。 $ git add file1 file2 file3 你现在为commit做好了准备,你可以使用git diff命令再加上–cached参数,看看哪些文件将被提交(commit)。 (如果没有–cached参数,git diff会显示当前你所有已做的但没有加入到索引里的修改。)你也可以使用git status命令来获得当前项目的一个状况。
用户3004328
2018/09/06
7450
如何从Google Play下载Android应用的APK安装文件?
有时候可能因为种种原因,你无法直接在手机上连接Google Play来下载应用(比如说你设备不兼容,说你所在地区不支持,或者你想装到上不去Google Play的Kinlde上),但你又想安装这个应用,怎么办呢?
Enjoy233
2019/03/05
8.7K0
如何从Google Play下载Android应用的APK安装文件?
Anbox安装apk失败(提示Failure res=-113等)的解决方法
详细描述,如下(Anbox:如何安装Google Play商店并启用ARM(libhoudini)支持,简单方法):
zhangrelay
2019/01/31
8.4K0
Anbox安装apk失败(提示Failure res=-113等)的解决方法
uniapp下载apk并且安装(uniapp打包后apk白屏)
-alias xxx : xxx是别名 xxx.keystore : 文件名
全栈程序员站长
2022/08/01
6.5K0
uniapp下载apk并且安装(uniapp打包后apk白屏)
Apache编译后无法正常工作
因为某个场景的需求,要在一个国产系统Rocky4.2(国产凝思4.2操作系统)上安装Apache,虽说此系统是基于Redhat 5.8开发的,但是发现yum安装源包管理,RPM命令倒是能用,但是底层依赖完全没有,这就尴尬了,so,只能源码编译安装了。
后场技术
2020/09/03
2.8K0
网页离开时改变标题“崩溃欺骗”
我们先创建一个 js 文件,我们用记事本就好了,然后改个文件名,不妨就叫crash-cheat.js吧,你们可以随意! 然后把文件放到 source 文件夹的 js 文件夹的 src 里面。(我用的 next 主题,放这里统一存放,其他主题随意)
Cell
2022/02/25
1.2K0
缩小APK,增加下载量
原文地址:Shrinking APKs, growing installs: How your app’s APK size impacts install conversion rates 原文作者
Android 开发者
2018/05/31
2.9K0
iPhone Safari 下载企业包出现 apk
有人反馈企业包下载链接,使用 iPhone Safari 打开后出现下载 apk 的提示
莫空9081
2021/11/24
1.2K0
如何在程序崩溃时自动生成 stacktrace
有什么好的办法可以在 C/C++ 程序段错误退出时输出堆栈信息,来方便查找错误么?
ClearSeve
2022/02/10
1K0
pycharm调试教程_程序调试时应当用
在了解Python编程之前,我们需要先弄明白如何编写运行代码。所以非常有必要先讲解一下Python的集成开发环境,也就是IDE(Integrated Development Environment)。PyCharm是一款优秀的开源Python语言集成开发工具。PyCharm能够调试运行程序,另外它还提供了强大的代码提示功能。在PyCharm的下载页面能够指定安装系统选择付费版(Professional)或者免费版(Community)进行安装。付费版的PyCharm提供了更强大的Python服务器后端开发功能。这里我们以windows系统免费版(PyCharm Community)下载安装。我们只对PyCharm的基本功能进行简单概括,详细内容请查阅官方文档。PyCharm下载地址(https://www.jetbrains.com/PyCharm/download/#section=windows)
全栈程序员站长
2022/09/25
1.3K0
pycharm调试教程_程序调试时应当用
5分钟短文 | Android证书生成,签名,验证,虽然难,但学一次就够了!
从Android演进开始,APK签名就已经成为Android的一部分,并且android要求所有Apks都必须先签名,然后才能将其安装在设备上。关于如何生成密钥以及如何签名的文章很多。一个Apk,但我们将从安全角度进行研究。在对Apk文件进行反编译或反向工程之后,应查看哪个文件,以获取有关最初对应用进行签名的开发人员的更多信息。
程序员小助手
2020/06/17
1.1K0
直接下载google play应用-APK Downloader
作者:matrix 被围观: 4,603 次 发布时间:2013-11-08 分类:兼容并蓄 | 2 条评论 »
HHTjim 部落格
2022/09/26
4.8K0
直接下载google play应用-APK Downloader
如何在.NET程序崩溃时自动创建Dump?
首先能明确的一点是"程序崩溃退出了是不能用常规的方式 dump 的",因为整个进程树都已经退出。现场已经无法使用常规的方式读取到。
InCerry
2022/11/14
1.8K0
apk加壳加密工具(apk protect) v1.0下载「建议收藏」
apk加壳加密工具(apk_protect)是用于加密apk文件中dex文件的加密工具,加密的东西主要有字符串加密、流程加密、类名加密和api加密(未完成,后续支持)等,有于较好的保护apk文件,使之不易激活成功教程分析。__我对apk_protect在线加密的有效性进行了测试和分析,发现确实给android_apk提供了无法激活成功教程的加密壳。虽然在线加密已经是非常省时省力的了,但是仍然有不少程序员懒于折腾(尽管这已经不叫折腾了,就是上传一下再下载,比起写代码来说,这简直就是享受)。于是,意外的发现他们已经推出了懒人版apk_protect。没错,懒人版!也就是免安装单机版!无ads无插件无需安装,简单选定apk文件点击加密即可!_____使用方法___运行apkcrypt.exe,选择你所需要加密的apk,然后点击“add_apk_protect”。
全栈程序员站长
2022/09/14
1.7K0
win7怎么查看驱动是否正常工作
我们在使用电脑的时候经常会遇到各种各样的问题,今天我就教大家在电脑使用过程中出现问题时怎么检查电脑驱动是否正常齐全。
点云PCL博主
2019/07/30
2.5K0
VC调试时输出调试信息到Debug窗口
TRACE宏(afx.h, AfxTrace) (TRACE将信息输出到afxDump对象,只在_DEBUG定义时输出,最多输出512个字符,格式化与printf类似) afxDump对象(afx.h, CDumpContext) (afxDump调用OutputDebugString把信息输出到Debug窗口,继承CObject的类可以重载Dump方法格式化此类的Dump信息,输出时把afxDump作为Dump方法的参数) OutputDebugString(windows.h) (TRACE, afxDump在使用MFC时使用,不使用MFC时可以用OutputDebugString,AfxOutputDebugString和OutputDebugString用法一样)
战神伽罗
2019/07/24
1.7K0
点击加载更多

相似问题

从playstore下载时签名的apk崩溃

12

获取崩溃签名的apk /bundle,但正常调试apk工作正常

115

下载apk时从google playstore获取邮件id

20

从playstore下载时应用程序崩溃

00

如何在playstore ApK上安装调试APK

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文