Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Nodejs,如何在返回承诺的异步迭代之间延迟执行_Node.js_Asynchronous_Async Await - Fatal编程技术网

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接受答案会有帮助。