并发编程和并行编程有什么区别?我问谷歌,但没有找到任何帮助我理解这种差异的东西.你能给我一个例子吗?
现在我发现了这个解释:http://www.linux-mag.com/id/7411 - 但"并发性是程序的属性"vs"并行执行是机器的属性"对我来说还不够 - 我还不能说什么是什么.
我想创建一个显示来自数据库的一些数据的页面,所以我创建了一些从我的数据库中获取数据的函数.我只是Node.js的新手,所以据我所知,如果我想在一个页面中使用所有这些(HTTP响应),我必须将它们全部嵌套:
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
var html = "<h1>Demo page</h1>";
getSomeDate(client, function(someData) {
html += "<p>"+ someData +"</p>";
getSomeOtherDate(client, function(someOtherData) {
html += "<p>"+ someOtherData +"</p>";
getMoreData(client, function(moreData) {
html += "<p>"+ moreData +"</p>";
res.write(html);
res.end();
});
});
});
Run Code Online (Sandbox Code Playgroud)
如果有很多这样的函数,那么嵌套就成了问题.
有办法避免这种情况吗?我想这与你如何组合多个异步函数有关,这似乎是一个基本的东西.
处理多个异步回调的最佳方法/库是什么?现在,我有这样的事情:
_.each(stuff, function(thing){
async(thing, callback);
});
Run Code Online (Sandbox Code Playgroud)
我需要在为每个元素触发回调后执行一些代码stuff.
最干净的方法是什么?我愿意使用库.
可能重复:
在node.js中协调并行执行
首先,动手伪代码:
forEach(arrayelements) {
asyncQueryFunction(function(qres) {
//work with query results.
});
}
// finally, AFTER all callbacks did return:
res.render("myview");
Run Code Online (Sandbox Code Playgroud)
怎么做?
如果不够清楚,我会解释:
我需要执行一系列"更新"查询(在mongodb中,通过mongoose),循环遍历文档ID列表.对于我的数组中的每个id,我将调用一个异步函数,它将返回查询结果(实际上我不需要对它们做任何事情).
我知道我必须使用.forEach()javascript循环,但是只有在我的所有异步查询完成后才能执行我的"最终"回调?
我已经使用优秀的异步库(https://github.com/caolan/async)来实现这种任务,当我执行一系列"有限"任务时.但我不认为我可以传递一系列不同的功能.
我可以吗?
在下面的代码中,我试图一次性发出多个(大约10个)HTTP请求和RSS解析.
我在forEach我需要访问和解析结果的URI数组上使用标准构造.
码:
var articles;
feedsToFetch.forEach(function (feedUri)
{
feed(feedUri, function(err, feedArticles)
{
if (err)
{
throw err;
}
else
{
articles = articles.concat(feedArticles);
}
});
});
// Code I want to run once all feedUris have been visited
Run Code Online (Sandbox Code Playgroud)
我明白,在调用函数时,我应该使用回调.但是,我能想到在这个例子中使用回调的唯一方法是调用一个函数来计算它被调用了多少次,并且只有当它被调用的次数相同时才会继续调用feedsToFetch.lengthhacky.
所以我的问题是,在node.js中处理这种情况的最佳方法是什么.
优选地,没有任何形式的阻塞!(我仍然希望那种超快的速度).这是承诺还是其他什么?
谢谢,丹尼
我试图按顺序执行以下函数(同步/异步)数组(避免callbackHell),以实现函数runCallbacksInSequence(我需要实现自己的函数以了解回调如何工作并避免使用Async.js)。
这是我到目前为止所拥有的。该功能runCallbacksInSequence运行良好,直到callback多次获得相同的效果为止。它停止并且不再继续执行下一个回调。理想情况下,如果callback多次获得相同的结果,则不应第二次执行,而应继续执行下一次callback。
如果您有任何想法,请告诉我我做错了什么以及如何解决。 -没有承诺和异步/等待
function first(cb) {
setTimeout(function() {
console.log('first()');
cb(null, 'one');
}, 0);
}
function second(cb) {
setTimeout(function() {
console.log('second()');
cb(null, 'two');
}, 100);
}
function third(cb) {
setTimeout(function() {
console.log('third()');
cb(null, 'three');
}, 0);
}
function last(cb) {
console.log('last()');
cb(null, 'lastCall');
}
const cache = {};
function runCallbacksInSequence(fns, cb) {
fns.reduce(
function(r, f) {
return function(k) {
return r(function() {
if (cache[f]) {
return;
// f(function(e, x) { …Run Code Online (Sandbox Code Playgroud)例如:
使用jquery ajax在parrallel中获取5页。当page2返回时,什么也不做。当page1返回时,对page1和page2进行操作。
// assume there is some operator that can do this,
// then it might look like this?
Rx.Observable.range(1, 5).
someOperator(function(page) {
return Rx.Observable.defer( () => $.get(page) );
}).scan(function(preVal, curItem) {
preVal.push(curItem);
return preVal;
}, []);
Run Code Online (Sandbox Code Playgroud) 我的代码同时创建了两个ajax调用(我假设并行性会更高效).如果两个调用都成功,我想加载一个表.这样做的正确方法是什么?
我有这个问题从node.js异步查询mongodb.这是我的代码
var values = [];
var positives = new Array();
var negatives = new Array();
var server1 = new mongodb.Server('localhost',27017, {auto_reconnect: true});
var db1 = new mongodb.Db('clicker', server1);
db1.open(function(err, db) {
if(!err) {
db1.collection('feedback', function(err, collection) {
for (var i=0;i <5; i++) {
collection.find(
{value:1},
{created_on:
{
$gte:startTime + (i*60*1000 - 30*1000),
$lt: startTime + (i*60*1000 + 30*1000)
}
},
function(err_positive, result_positive) {
result_positive.count(function(err, count){
console.log("Total matches: " + count);
positives[i] = count;
});
}
);
collection.find(
{value:0},
{created_on:
{ …Run Code Online (Sandbox Code Playgroud) 我有一个函数foo,它在循环中进行多个(并行)异步调用.我需要等到所有呼叫的结果都可用.如何foo在所有数据可用后返回完整结果,或以其他方式触发某些处理?
我尝试将每个结果添加到数组中,但是直到我需要使用它之后才会填充数组.
function foo() {
var results = [];
for (var i = 0; i < 10; i++) {
someAsyncFunction({someParam:i}, function callback(data) {
results.push(data);
});
}
return results;
}
var result = foo(); // It always ends up being an empty array at this point.
Run Code Online (Sandbox Code Playgroud)
注意:这个问题是按照现有通用"如何从异步调用返回响应?"的方式有意识地通用的.问题.这个问题有一些很好的答案,但不包括多个异步调用.还有一些其他问题提到多个调用,但我找不到任何基于循环的调用,有些只有jQuery答案等等.我希望这里有一些不依赖于特定库的通用技术.
javascript ×7
asynchronous ×4
node.js ×4
ajax ×1
concurrency ×1
express ×1
extjs ×1
mongodb ×1
promise ×1
rxjs ×1