与 CasperJS 中的第三方异步 API 同步
Synchronizing with 3rd-party asynchronous API in CasperJS
在这里,我感到被一些应该在casper.then()
回调中运行的异步代码卡住了。
casper.then(function() {
var spawn = require("child_process").spawn;
var child = spawn("somecommand", ["somearg"]);
child.stdout.on("data", function (data) {
console.log("spawnSTDOUT:", JSON.stringify(data))
});
});
casper.then(function () {
// Something that should be synchonized
});
有没有办法确保第二个then()
仅在数据回调触发后执行?
我很想用默认情况下不会在执行后将控制权传递给第二个then()
的东西替换第一个then()
,而是通过在数据回调中调用某些东西(我们称之为"解析",因为承诺模式所暗示)来做到这一点。
使用casper.waitFor()
的例子也值得赞赏,但在这种情况下,我会收到一种"常见做法"建议。
您必须等到子进程退出。这通常使用(全局)变量完成。它是在子进程"退出"的情况下设置的,后续casper.waitFor()
将等到该变量为真。您可能需要调整超时。
casper.then(function() {
var spawn = require("child_process").spawn;
var child = spawn("somecommand", ["somearg"]);
child.stdout.on("data", function (data) {
console.log("spawnSTDOUT:", JSON.stringify(data))
});
var childHasExited = false;
child.on("exit", function (code) {
childHasExited = true;
})
this.waitFor(function check(){
return childHasExited;
}, null, null, 12345); // TODO: adjust the timeout
});
casper.then(function () {
// Something that should be synchonized
});
CasperJS的脚本并不是真正基于承诺的,这就是为什么必须使用waitFor()
。请参阅我的答案 这里 了解更多信息。
您可以使用无限等待来代替casper.waitFor()
:
casper.infWaitFor = function(check, then) {
this.waitFor(check, then, function onTimeout(){
this.infWaitFor(check, then);
});
return this;
}
相关文章:
- 无法使用开放天气图 API 异步获取天气
- Dojo Build System - 使用带有谷歌地图API的异步插件
- Angularjs的异步API请求
- 并行开发同步/阻塞和异步/非阻塞库api的好方法是什么?(JavaScript)
- 异步编程-如何在对象数组中循环,并使用从api获取的数据更改每个对象的属性
- 如何重新构建此 for 循环,以便在异步 api 调用完成之前不会进行下一次迭代
- 将异步 API 转换为同步 API.(我保证有一个很好的理由)
- 一个回调两个异步函数,一个是谷歌 api getDistanceMatrix
- 如何优化异步.js API 调用
- 需要来自异步 API 调用的数据的构造函数
- 具有回调函数的异步API请求
- 如何使两个异步API调用一个接一个地执行
- 结合Chrome异步api
- JS:异步api,最终结果总是空的
- 带有Express异步API调用的Node.JS
- 使用 Jasmine 使用异步 API 测试 Flux 存储
- Javascript如何存储和返回来自多个异步API调用的响应
- 与 CasperJS 中的第三方异步 API 同步
- 如何在特定时间跨度内进行具有速率限制的异步 API 调用
- 长时间运行的异步API方法