Node.js Nodejs,如何在返回承诺的异步迭代之间延迟执行
我有以下功能,在所有通知成功/未成功发送后,必须返回一个Node.js Nodejs,如何在返回承诺的异步迭代之间延迟执行,node.js,asynchronous,async-await,Node.js,Asynchronous,Async Await,我有以下功能,在所有通知成功/未成功发送后,必须返回一个承诺: sendNotifications : function(notificationArray, successCallback, stats){ return notificationArray.reduce((acc, x)=>{ return Promise.all([ notificationUtil.sendNotificatio
承诺
:
sendNotifications : function(notificationArray, successCallback, stats){
return notificationArray.reduce((acc, x)=>{
return Promise.all([
notificationUtil.sendNotification(x)
.then(
function() {
successCallback(x);
}
)
.catch(e=>{
//handle failure...
}),
new Promise(resolve => setTimeout(resolve, 1000))//Was thinking it will delay the sendNotification calls but it hasn't.
])
}, Promise.resolve());
},
以下是notificationUtil.sendNotification(x)
方法:
sendEmail: sendNotification (options) {
return new Promise(function(resolve,reject){
someNPM.sendNotification(function(data) {
if(!data.error_code && !data.is_error)
resolve(true);
else
{
reject(false);
console.error("ERROR: " + data.message);
}
},
options);
});
}
函数someNPM.sendNotification
来自外部NPM,它不返回承诺,因此,我承诺了它
问题是,我预计在notificationUtil.sendNotification(x)
调用之间会有1000ms
的延迟,但事实并非如此,而且sendNotification(x)
会立即在notificationArray
中的所有元素上调用
有人能发现问题吗
编辑:
明确地说,我的要求是在通知之间等待1000毫秒,这是一种可能的实现。我没有检查这个代码,但它应该给出一个想法
function timeout(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
sendNotifications : async function (notificationArray, successCallback, stats){
const length = notificationArray.length;
const promises = [];
for(let i = 0; i < length; i++) {
promises.push(notificationUtil.sendNotification(notificationArray[i]));
await timeout(3000);
}
await Promise.all(promises);
};
功能超时(毫秒){
返回新承诺((resolve)=>setTimeout(resolve,ms));
}
sendNotifications:异步函数(notificationArray、successCallback、stats){
常量长度=notificationArray.length;
常量承诺=[];
for(设i=0;i
Promise.all同时启动它们,包括1000毫秒的等待。你只是在拖延完成。如果希望在所有操作之间出现延迟,则需要在每个操作运行之前安排一个不断增加的等待时间。或者使用完全不同的构造。@jonrsharpe无需使用Promise.all,只要它不会导致延迟以所需的方式发生。你能更具体地说明你建议的方法吗?要求在两次通知之间有1000ms
延迟。为什么要使用数组。在不使用累加器时减少?@Dijkstra这只是一种语法方法。可以轻松切换以获得所需结果您可以确保只有在所有notificationUtil.sendNotification
调用结束后,sendNotifications
才会返回承诺吗?请注意,notificationUtil.sendNotification
内部有一个async
函数:someNPM.sendNotification
。创建async
函数时,它会返回一个承诺。基本的!您必须做的一件事是等待notificationUtil.sendNotification
返回的所有承诺。让我编辑我的答案。看起来很棒!谢谢你的帮助和解释@t接受答案会有帮助。