2017-09-15 23 views
0

鉴于以下代码我在与node fileName.js它似乎运行回路中的所有的项目的命令行运行和然后睡在端部部分JS /节点的代码。 ..就像它都是平行运行或其他东西。试图阻止睡眠中使用的setTimeout

我希望代码在setTimeout期间阻止/暂停,而不是仅在setTimeout完成后运行该功能。或者,在此用例中,如果setTimeout不正确,则使用其他方法。

const removeUsers = async() => { 
    const users = await db.getUsers(); // returns 32 users. 

    // Split the users up into an array, with 2 users in each 'slot'. 
    var arrays = [], size = 2; 
    while (users.length > 0) { 
     arrays.push(users.splice(0, size)); 
    } 

    // Now, for each slot, delete the 2 users then pause for 1 sec. 
    arrays.forEach(a => { 
     console.log(++counter;); 

     // Delete 2x users. 
     a.forEach(async u => { 
      console.log('Deleting User: ' + u.id); 
      await 3rdPartyApi.deleteUser({id: u.id}); 
     }); 

     // Now pause for a second. 
     // Why? 3rd party api has a 2 hits/sec rate throttling. 
     setTimeout(function() { console.log('Sleeping for 1 sec'); }, 1000); 
    }); 
} 

和日志是这样的..

1. 
Deleting User: 1 
Deleting User: 2 
2. 
Deleting User: 3 
Deleting User: 4 
3. 
... 
(sleep for 1 sec) 
(sleep for 1 sec) 
(sleep for 1 sec) 
... 
end. 

了解如何睡眠不觉得它会阻止..它只是触发关闭,然后获取一个秒后处理的睡眠命令。 ..

这是我真正追求的是...

1. 
Deleting User: 1 
Deleting User: 2 
(sleep for 1 sec) 
2. 
Deleting User: 3 
Deleting User: 4 
(sleep for 1 sec). 
3. 
... 
end. 
+0

,我想建立对象的请求的数组消耗,然后创建一个next()函数,该函数将pop()作为堆栈,并创建ajax调用和setTimeout自身(next()),或者“呈现”完成的状态。 – dandavis

回答

1

这需要一堆async功能。他们每个都会返回一个承诺(async函数总是返回承诺),并且这些承诺被丢弃,因为Array#forEach不会对它传递的函数的返回值做任何事情。

a.forEach(async u => { 
    console.log('Deleting User: ' + u.id); 
    await 3rdPartyApi.deleteUser({id: u.id}); 
}); 

这会启动一个计时器,甚至不会尝试等待它。

setTimeout(function() { console.log('Sleeping for 1 sec'); }, 1000); 

分裂定时器成返回一个承诺在适当的时间量解析功能(可作为Promise.delay如果你使用蓝鸟,你应该是):

const delay = ms => 
    new Promise(resolve => { 
     setTimeout(resolve, ms); 
    }); 

和保持一个async功能一切,所以你不放弃任何承诺:

function* chunk(array, size) { 
    for (let i = 0; i < array.length;) { 
     yield array.slice(i, i += size); 
    } 
} 

const removeUsers = async() => { 
    const users = await db.getUsers(); // returns 32 users. 

    for (const a of chunk(users, 2)) { 
     console.log(++counter); 

     // Delete 2x users. 
     for (const u of a) { 
      console.log('Deleting User: ' + u.id); 
      await ThirdPartyApi.deleteUser({id: u.id}); 
     } 

     console.log('Sleeping for 1 sec'); 
     await delay(1000); 
    } 
}; 
在这些情况下
+0

https://media.giphy.com/media/xT0BKhunZXlEsnpz7q/giphy.gif谢谢!!!! –