我知道这个问题已被无数次询问,但我无法弄清楚我的生活如何让这个答案在我的情况下工作:等待异步javascript函数返回
我正在循环通过外环中的一些"电视频道",然后在内环中循环一周中的日期.在内部循环中,我向服务器发出ajax请求以获取数据,然后我将其存储/缓存以供以后使用,如此
var dates = []; //<-- Contains a list of dates for the coming week
var baseUrl = "http://www.someserver.com";
var storedChannels = [1,2,3,4,5,6,7,8,9,10,45,23,56,34,23,67,23,567,234,67,345,465,67,34];
for(ch = 0; ch < storedChannels.length; ch++) {
var channel = storedChannels[ch];
for(d=0; d < 7; d++) {
var currentDate = dates[d];
ajax({
url: baseUrl+"?ch="+channel+"&dt=currentDate"+,
complete: function(res) {
CMLocalStore.setString('ch' + ch + "_" + scheduleDay, res);
},
});
//Want to wait here till the ajax request completes.
//Do not want to continue to next iteration. …Run Code Online (Sandbox Code Playgroud) 我正在编写一个iOS模块,它当前以异步方式发送电子邮件(使用委托).它的使用SKPSMTPMessage效果很好.我的问题是客户希望代码完全阻止线程,直到电子邮件发送(或无法发送).因此,他们基本上要求同步解决方案,当前它将尝试发送电子邮件,然后在发送电子邮件之前从该代码块返回.
因此,我没有尝试以SKPSMTPMessage同步的方式重写代码(似乎没有任何同步选项),我希望找到一些方法将异步代码块包装在自己的线程中,并可能使主线程等待它完全结束(代表和所有).
我尝试了一些使用NSOperations的不同方法,NSThread但也许我没有做正确的事情,因为每次我试图阻止主线程时,异步委托调用仍然似乎永远不会完成(他们回到主线程还是什么东西) ?).
任何信息甚至其他想法赞赏.
PS~我意识到这有点倒退了.在大多数情况下,异步似乎是要走的路,但这是一个特例,客户有理由想要它.
编辑:感谢所有的输入.正如其中一个答案所建议的那样,我最后只使用了一个等待代表返回的while循环,但是让runLoop继续如下:
while( ![messageDelegate hasFinishedOrFailed] ){
// Allow the run loop to do some processing of the stream
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
Run Code Online (Sandbox Code Playgroud) 我有一个不是 Web应用程序的节点应用程序 - 它在返回之前完成一系列异步任务1.在返回之前,程序的结果立即打印到控制台.
如何在返回之前确保完成所有异步工作?通过确保我们在调用res.end()之前完成的所有任务,我能够在Web应用程序中实现类似的功能,但在让脚本返回之前,我没有任何等效的最终"事件".
请参阅下面的我当前的(损坏的)功能,试图等到callStack为空.我刚刚发现这是一种无意义的方法,因为node在进入processObjWithRef中调用的任何异步函数之前等待processHub完成.
function processHub(hubFileContents){
var callStack = [];
var myNewObj = {};
processObjWithRef(samplePayload, myNewObj, callStack);
while(callStack.length>0){
//do nothing
}
return 1
}
Run Code Online (Sandbox Code Playgroud)
注意:我曾多次尝试使用async之类的库来实现这种行为(请参阅我的相关问题如何在nodejs中同步调用此请求?)所以请在建议之前考虑答案和注释答案基于'只是使用asynch'.
当用户使用Google Analytics(analytics.js)离开页面时,我正在尝试跟踪事件.虽然不知道用户将如何离开,但可能是因为外部链接或只是关闭标签.所以我的想法是挂钩到beforeunload或unload事件然后:
window.addEventListener("beforeunload", function() {
ga('send', 'event', 'some', 'other', 'data');
});
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,对GA服务器的请求是同步还是我可以用hitCallback属性以某种方式强制该行为?如果那是不可能的,我还能怎样做到这一点?优选地,无需为用户设置超时或固定等待时间!
我有一个包含数据的数组x [].还有一系列"系统状态"c [].过程:
for(i = 1; i < N; i++)
{
a = f1(x[i] + c[i-1]);
b = f2(x[i] + c[i-1]);
c[i] = a + b;
}
Run Code Online (Sandbox Code Playgroud)
有没有发现的价值的任何有效的方式f1,并f2使用2个并行线程2核心系统?我的意思是以下(伪代码):
thread_1
{
for(i = 1; i < N; i++)
a = f1(x[i] + c[i-1]);
}
thread_2
{
for(i = 1; i < N; i++)
{
b = f2(x[i] + c[i-1]);
c[i] = a + b; //here we somehow get a{i} from thread_1
}
}
Run Code Online (Sandbox Code Playgroud)
f1并且f2不是时间消耗,但必须多次计算,所以期望的加速大约是x2.请参见图表以获取图形表示: …
我在Windows中的大部分日常编程工作现在都是各种I/O操作(管道,控制台,文件,套接字......).我很清楚从不同类型的句柄读取和写入的不同方法(同步,异步等待事件完成,等待文件HANDLE,I/O完成端口和可警告的I/O).我们使用其中许多.
对于我们的一些应用程序,只有一种方法来处理所有句柄是非常有用的.我的意思是,程序可能不知道它收到了什么样的句柄,我们想要使用,比方说,I/O完成端口.
首先我会问:
我们假设我有一个句柄:
HANDLE h;
Run Code Online (Sandbox Code Playgroud)
我从某个地方收到了I/O进程.有没有简单可靠的方法来找出它创建的标志?有问题的主要标志是FILE_FLAG_OVERLAPPED.
到目前为止,我所知道的唯一方法是尝试将这样的句柄注册到I/O完成端口(使用CreateIoCompletionPort()).如果成功,则使用FILE_FLAG_OVERLAPPED创建句柄.但是之后只能使用I/O完成端口,因为如果不关闭它HANDLE h本身就不能从中取消注册句柄.
提供一种简单的方法来确定存在FILE_FLAG_OVERLAPPED,我的第二个问题就出现了:
有没有办法如何将这样的标志添加到现有的句柄?这将使最初为同步操作打开的句柄打开以进行异步操作.有没有办法如何创建相反的(删除FILE_FLAG_OVERLAPPED从异步创建同步句柄)?
通过MSDN阅读和google搜索后,我没有找到任何直接的方法.至少会有一些技巧可以做同样的事吗?就像使用CreateFile()函数或类似的东西以相同的方式重新创建句柄一样?某些东西甚至部分记录或根本没有记录?
我需要这个的主要地方是确定进程应该从第三方应用程序发送给它的句柄读取/写入的方式(或改变方式).我们无法控制第三方产品如何创建其句柄.
亲爱的Windows大师:请帮助!
带着敬意
马丁
http.getnode.js中是否存在该方法的同步版本?
就像是:
http.getSync({
host: 'google.com',
port: 80,
path: '/'
}, function(response){
});
console.log(response)
Run Code Online (Sandbox Code Playgroud)
有时它会非常有用.
我是分布式tensorflow的新手,我正在寻找一个很好的例子来对CPU进行同步训练.
我已经尝试过分布式Tensorflow示例,它可以通过1个参数服务器(1个带1个CPU的计算机)和3个工作程序(每个worker = 1个带1个CPU的计算机)成功执行异步训练.但是,当涉及到同步训练时,我无法正确运行它,尽管我已经按照SyncReplicasOptimizer教程 (V1.0和V2.0)进行了操作.
我已将正式的SyncReplicasOptimizer代码插入到工作异步训练示例中,但训练过程仍然是异步的.我的详细代码如下.任何与同步训练相关的代码都在******的范围内.
import tensorflow as tf
import sys
import time
# cluster specification ----------------------------------------------------------------------
parameter_servers = ["xx1.edu:2222"]
workers = ["xx2.edu:2222", "xx3.edu:2222", "xx4.edu:2222"]
cluster = tf.train.ClusterSpec({"ps":parameter_servers, "worker":workers})
# input flags
tf.app.flags.DEFINE_string("job_name", "", "Either 'ps' or 'worker'")
tf.app.flags.DEFINE_integer("task_index", 0, "Index of task within the job")
FLAGS = tf.app.flags.FLAGS
# start a server for a specific task
server = tf.train.Server(cluster, job_name=FLAGS.job_name, task_index=FLAGS.task_index)
# Parameters ----------------------------------------------------------------------
N = 3 # number of replicas
learning_rate = …Run Code Online (Sandbox Code Playgroud) 我承诺很多困惑.这是同步还是异步?
return new Promise (function(resolved,reject){
//sync or async?
});
Run Code Online (Sandbox Code Playgroud) synchronous ×10
asynchronous ×5
javascript ×4
node.js ×3
ajax ×1
c# ×1
c++ ×1
createfile ×1
distributed ×1
get ×1
http ×1
ios ×1
jquery ×1
objective-c ×1
promise ×1
tensorflow ×1
wait ×1
winapi ×1