我目前正在与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) 我需要用同步调用调用fetch,我知道jquery ajax我可以使用我可以{async: false}
通过这个选项来获取函数吗?
功能是:
[1,2,3].map( function (item)
{
console.log(item);
//return 'something';
});
Run Code Online (Sandbox Code Playgroud)
我的预期行为只有1作为输出,除非我取消注释
//return 'something'
Run Code Online (Sandbox Code Playgroud)
但我真的明白了
1
2
3
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么 ?
更新:
我正在使用nodejs进行测试.
我真的不明白.
var async = require("async");
[1,2,3].map( function (item)
{
console.log(item);
//return 'something';
});
async.map([1,2,3], function (item,callback)
{
console.log(item);
//callback(null,true)
}, function (err,result)
{
console.log(result);
}
);
Run Code Online (Sandbox Code Playgroud)
两者都返回相同
1
2
3
Run Code Online (Sandbox Code Playgroud)
而且我真的想等到我得到一个回复或回调,直到下一个项目被执行.
解决了
async.mapSeries([1,2,3], function (item,callback)
{
console.log(item);
//callback(null,true)
}, function (err,result)
{
console.log(result);
}
);
Run Code Online (Sandbox Code Playgroud)
是这样做的方式.
在计算的同步/阻塞模型中,我们通常说执行线程在等待IO任务完成时将等待(被阻塞).
我的问题是,这通常会导致CPU核心执行线程空闲,还是等待IO的线程通常会被上下文切换出来并进入等待状态,直到IO准备好被处理?
multithreading asynchronous cpu-architecture synchronous blocking
任何人都可以帮我理解Android中的同步和异步活动吗?
Android中同步和异步活动的确切含义是什么?
StartActivity,StartSubActivity并StartAcivityForResult同步或异步启动活动,或者它们可以以两种方式运行?
请解释,因为我已经阅读了很多文章,但未找到任何适当的解释.
如果我想以特定的顺序执行同步和异步函数,我可以使用jQuery promise,但它看起来并不像我期望的那样工作.
函数a,b和c应该在deferred.resolve()调用时按顺序执行我希望函数b被执行但是无论是否调用了解析,所有函数都会立即执行.
这是代码:
function a(){
var deferred = $.Deferred();
setTimeout(function(){
console.log("status in a:",deferred.state());
//this should trigger calling a or not?
deferred.resolve("from a");
},200);
console.log("a");
return deferred.promise();
};
function b(){
var deferred = $.Deferred();
setTimeout(function(){
console.log("status in b:",deferred.state());
deferred.resolve("from b");
},200);
console.log("b");
return deferred.promise();
}
//synchronous function
function c(){
var deferred = $.Deferred();
console.log("c");
console.log("status in c:",deferred.state());
deferred.resolve("from c");
return deferred.promise();
}
function test(){
fn=[a,b,c],i=-1,
len = fn.length,d,
d = jQuery.Deferred(),
p=d.promise();
while(++i<len){
p=p.then(fn[i]);
}
p.then(function(){
console.log("done");
}, …Run Code Online (Sandbox Code Playgroud) 同步请求和异步请求之间的性能(速度方面)是否有任何差异?
使用异步请求的原因是什么?
为什么如果我MessageBox()在我的消息循环中调用看似同步的Windows函数,循环本身不会像我调用Sleep()(或类似函数)那样冻结?为了说明我的观点,请采用以下骨架WndProc:
int counter = 0;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
SetTimer(hwnd, 1, 1000, NULL); //start a 1 second timer
break;
case WM_PAINT:
// paint/display counter variable onto window
break;
case WM_TIMER: //occurs every second
counter++;
InvalidateRect(hwnd, NULL, TRUE); //force window to repaint itself
break;
case WM_LBUTTONDOWN: //someone clicks the window
MessageBox(hwnd, "", "", 0);
MessageBeep(MB_OK); //play a sound after MessageBox returns
break;
//default …Run Code Online (Sandbox Code Playgroud) 我想要做的是将一个加载图像附加到div(所以用户知道正在加载的东西)然后我调用一个jquery ajax函数,它被设置为"async:false".这是我的代码:
$jQuery("#playersListDiv").html(loadingImage);
$jQuery.ajax({
type: "POST", /* this goesn't work with GET */
url: urlValue, /*ex: "NBAgetGamesList.php" */
data: parameters, /*ex: "param1=hello" */
cache: false,
async: false,
success: function(data){
}
});
Run Code Online (Sandbox Code Playgroud)
问题是浏览器锁定并且不会附加加载图像,直到完成ajax调用之后,这当然没用.Firefox是唯一实际附加加载图像的浏览器.IE,Chrome和Safari不要附加加载图片.
我知道浏览器锁定发生是因为async设置为false但这是我唯一的选择,因为我必须等待此请求完成才能继续,因为我需要返回的数据.
有没有办法解决?如果我在添加有效的加载图像之后发出警报,但我不希望每次都弹出警报.
我想了解龙卷风文档介绍页面上提供的基本示例.它有2个代码块.同步一个对我来说很好,我也理解它.但异步的是我无法理解的.
同步
from tornado.httpclient import HTTPClient
def synchronous_fetch(url):
http_client = HTTPClient()
response = http_client.fetch(url)
return response.body
Run Code Online (Sandbox Code Playgroud)
异步
from tornado.httpclient import AsyncHTTPClient
def asynchronous_fetch(url, callback):
http_client = AsyncHTTPClient()
def handle_response(response):
callback(response.body)
http_client.fetch(url, callback=handle_response)
Run Code Online (Sandbox Code Playgroud)
如果您能提供更好的示例,请执行此操作.
synchronous ×10
asynchronous ×7
javascript ×4
ajax ×3
jquery ×3
blocking ×2
android ×1
backbone.js ×1
c++ ×1
callback ×1
foreach ×1
map ×1
node.js ×1
promise ×1
python ×1
request ×1
tornado ×1
winapi ×1