gpt4 book ai didi

javascript - 在 CasperJS 中与第三方异步 API 同步

转载 作者:行者123 更新时间:2023-12-04 23:44:57 25 4
gpt4 key购买 nike

在这里,我觉得应该在 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() 的东西,我宁愿这样做这是通过在数据回调中调用某些东西(让我们称其为 promise 模式所建议的“解决”)。

使用 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 的脚本并非真正基于 promise ,这​​就是必须使用 waitFor() 的原因。看我的回答here了解更多。

您可以使用无限等待代替 casper.waitFor():

casper.infWaitFor = function(check, then) {
this.waitFor(check, then, function onTimeout(){
this.infWaitFor(check, then);
});
return this;
}

关于javascript - 在 CasperJS 中与第三方异步 API 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30912481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com