Javascript:在进入第三个函数之前测试两个异步调用
Javascript : testing two asynch calls before going to third function?
所以我有两个异步调用要调用一个Web服务。。。我的第三种方法需要这两种方法。
你们建议怎么做?
我试着在我的一个方法中设置一个标志(另一个方法调用第三个方法并发送一些数据)。。。所以在我的第三种方法中,我尝试了这个:
thirdMethod: function (returnedData) {
if (this.secondFunctionReturned != true) {
setTimeout(this.thirdMethod, returnedData, 100);
}
else {}
但这个暂停没有起作用(它没有为我传递数据)——只是想知道你们怎么想。。。谢谢。
假设您正在从每个异步调用中获取数据,这就是为什么在启动第三个调用之前需要它们的原因。我会让每个异步回调检查是否存在所有必需的数据,如果存在,则启动第三个函数。或者你可以使用一个计数器,但同样,假设你已经有了数据,计数器只是不必要的额外。
伪:
var dataFromCall1, dataFromCall2;
startAsync(function(data) {
dataFromCall1 = data;
if (dataFromCall2) {
thirdFunction(dataFromCall1, dataFromCall2);
}
});
startOtherAsync(function(data) {
dataFromCall2 = data;
if (dataFromCall1) {
thirdFunction(dataFromCall1, dataFromCall2);
}
});
或更少耦合:
var dataFromCall1, dataFromCall2;
startAsync(function(data) {
dataFromCall1 = data;
nextStep();
});
startOtherAsync(function(data) {
dataFromCall2 = data;
nextStep();
});
function nextStep() {
if (dataFromCall1 && dataFromCall2) {
thirdFunction(dataFromCall1, dataFromCall2);
}
}
或者计数器:
var counter = 0;
startAsync(function() {
// ...presumably some processing here...
// Possibly fire next step
handleCompletion();
});
startOtherAsync(function() {
// ...presumably some processing here...
// Possibly fire next step
handleCompletion();
});
function handleCompletion() {
if (++counter === 2) {
thirdFunction();
}
}
更新:
关于以下评论中的问题:
我试过一次,然后想了想这两个同时返回的一个例子。。。如果他们同时回来,这难道不会失败吗?
好问题,我本来应该回答这个问题:不,两个电话不可能同时发生。web浏览器中的JavaScript是单线程的(除非显式使用web工作程序,否则线程之间的交互也是显式的)。如果第二次调用完成时第一次调用的回调正在进行中,则第二次回调将排队,并且仅在第一次回调返回时运行。
我投票支持T.J.Crowder的答案中的计数器方法。
但是,另一个没有被建议的选择是,与其一次打两个电话,然后尝试与第三个同步,不如一次打一个电话。也就是说,进行第一个异步调用,并在其回调中进行第二个异步调用然后在其回调中将进行第三个调用。(T.J.的计数器方法可扩展性更强。)
关于您提到的超时没有为您传递数据的问题,那是因为您试图向setTimeout
传递太多参数。你需要这样做:
setTimeout(function(){ this.thirdMethod(returnedData); },
100);
相关文章:
- javascript测试是否存在两个标志中的任何一个
- 在Javascript中截断一个字符串,混淆了最后两个测试字符串
- 测试两个版本的 json 架构是否向后兼容
- 测试两个变量是否包含一些数据 JavaScript
- Protractor和Angular:如何在应用程序中一个接一个地测试两个页面
- 对两个不同的输入重复一组摩卡测试
- 如何定义 4 个函数来适应这两个测试(javascript/q)
- 如何在 JSON 字符串中选择两个测试对象并将它们映射到我的接口
- 两个文件使用超级测试与摩卡导致 EADDRINUSE
- 有没有可能比平方距离算法更快地测试两个圆的交点
- RegExp测试有两个变量:可能
- 如何测试两个HTML元素或jQuery选择器之间的等价性
- 聊天应用程序-测试两个客户端之间的交互
- 对照测试两个句子的起始字符
- 从两个javascript数组创建一个简单的测试
- 测试是否至少选中了两个复选框,然后将值插入数据库
- 用jasmine对位于不同模块的两个服务进行单元测试
- Jasmine单元测试AngularJS工厂的两个依赖项($http和另一个返回promise的工厂)
- 如何用JavaScript测试两个对象是否相同
- Javascript:在进入第三个函数之前测试两个异步调用