我没有完全了解Node.js的全部内容.也许是因为我主要是一个基于Web的业务应用程序开发人员.它是什么以及它的用途是什么?
到目前为止,我的理解是:
我的理解是否正确?如果是,那么即使I/O有什么好处,它对于并发性的东西更多吗?另外,Node.js的方向是成为一个类似于基于JavaScript(V8的)编程模型的框架吗?
正如标题所示.我该怎么做呢?
我想whenAllDone()在forEach-loop遍历每个元素并完成一些异步处理之后调用.
[1, 2, 3].forEach(
function(item, index, array, done) {
asyncFunction(item, function itemDone() {
console.log(item + " done");
done();
});
}, function allDone() {
console.log("All done");
whenAllDone();
}
);
Run Code Online (Sandbox Code Playgroud)
有可能让它像这样工作吗?当forEach的第二个参数是一个回调函数,它在经过所有迭代后运行?
预期产量:
3 done
1 done
2 done
All done!
Run Code Online (Sandbox Code Playgroud) JavaScript中的循环是同步还是异步?(for,while等)
假设我有:
for(let i=0; i<10; i++){
// A (nested stuff...)
}
// B ...
Run Code Online (Sandbox Code Playgroud)
使用for执行B会在A有时开始...(所以异步)
有没有办法以同步方式使用语句?
我目前正在与3个朋友一起使用nodeJs,expressJs,MongoDB,html5进行一个项目......由于我们对这些技术还不熟悉,我们遇到了一些问题.我无法找到解决方案的一个大问题是某些代码的异步执行.
我想要为每个循环完成,以便我有一个更新的在线好友列表,然后执行res.render(我在其中传递在线好友列表),因为当前它在完成循环之前执行res.render .码:
function onlineFriends(req, res) {
var onlinefriends = new Array();
onlinefriends.push("mark");
FriendList.findOne({
owner: req.session.username
}, function (err, friendlist) {
friendlist.friends.forEach(function (friend) { // here forEach starts
OnlineUser.findOne({
userName: friend
}, function (err, onlineFriend) {
if (onlineFriend != null) {
onlinefriends.push(onlineFriend.userName);
console.log("a loop");
}
});
});
console.log("online friends: " + onlinefriends);
console.log("redirecting");
res.render('index', { // this is still inside the forEach function
friendlist: friendlist.friends,
onlinefriendlist: onlinefriends,
username: req.session.username
});// and here it ends
});
Run Code Online (Sandbox Code Playgroud)
}
输出如下:
online friends: mark …Run Code Online (Sandbox Code Playgroud) 有人可以解释我这两者之间的不同之处:
async.each(items, function (item, callback) {
// Do something
});
Run Code Online (Sandbox Code Playgroud)
要么 :
items.forEach(function(item) {
// Do something
)};
Run Code Online (Sandbox Code Playgroud) 我正在学习Node.js,我在每个教程中都听到的是"Node is asynchronous and noblocking!"
我在普通的浏览器JavaScript中听说过只有某些东西,比如AJAX调用可以异步或非阻塞(使用回调)......这也是Node.js的真实情况,或者所有的Node.js回调函数都是异步的/非阻塞?
我对node.js很新,所以我想知道如何知道何时处理所有元素让我们说:
["one", "two", "three"].forEach(function(item){
processItem(item, function(result){
console.log(result);
});
});
Run Code Online (Sandbox Code Playgroud)
...现在,如果我想做一些只能在处理完所有项目时才能完成的事情,我该怎么做?
我确定这是一个相当简单的任务,但是目前我无法将其包裹住。我有一组嵌套的forEach循环,并且需要在所有循环完成运行时进行回调。
我愿意使用async.js
这就是我正在使用的:
const scanFiles = function(accounts, cb) {
let dirs = ['pending', 'done', 'failed'];
let jobs = [];
accounts.forEach(function(account) {
dirs.forEach(function(dir) {
fs.readdir(account + '/' + dir, function(err, files) {
files.forEach(function(file) {
//do something
//add file to jobs array
jobs.push(file);
});
});
});
});
//return jobs array once all files have been added
cb(jobs);
}
Run Code Online (Sandbox Code Playgroud) 我想将满足特定条件的所有值推送到数组然后返回此数组.这是我的代码
exports.getNearbyPosts = function (myLat, myLng){
var query = firebase.database().ref("posts/").orderByKey();
var listOfItems = [];
query.once("value")
.then(function(snapshot) {
snapshot.forEach(function(childSnapshot) {
var key = childSnapshot.key;
var childData = childSnapshot.val();
var dist = getDistanceBetweenCoord(childData.lat, childData.lng, myLat, myLng);
if(dist < 10239820938502){
listOfItems.push(childSnapshot);
}
});
});
return listOfItems;
}
Run Code Online (Sandbox Code Playgroud)
但是因为forEach是异步的,而且好像我不能在forEach上使用回调,所以我返回的listOfItems只是一个空数组.我也试过".then",但它只允许我在".then"中做更多的东西,我想把这个数组作为变量返回到代码的其他部分.在执行forEach后如何返回正确的数组?
根据JavaScript,Node.js:Array.forEach是异步的吗?,Array.forEach是同步的。但是,对于下面的代码:
function wait5() {
return new Promise(resolve =>
setTimeout(resolve, 5000));
}
async function main() {
console.log("Start");
[1,2].forEach(async (e) => {
const d = await wait5().then(()=> console.log("5s later") )
})
console.log("This should come last!");
}
main();
Run Code Online (Sandbox Code Playgroud)
输出为:
Start
This should come last!
5s later
5s later
Run Code Online (Sandbox Code Playgroud)
两个“ 5s之后”迅速相继问世。
为什么会这样呢?
如果我使用普通for循环:
async function main() {
console.log("Start");
for (let i=0;i<2;i++) {
const d = await wait5().then(()=> console.log("5s later") )
}
console.log("This should come last!");
}
Run Code Online (Sandbox Code Playgroud)
那么结果就是我想要的:
Start
5s later …Run Code Online (Sandbox Code Playgroud) javascript ×10
node.js ×6
asynchronous ×5
async.js ×2
arrays ×1
callback ×1
evented-io ×1
firebase ×1
foreach ×1
synchronous ×1
v8 ×1