gpt4 book ai didi

javascript - Laravel Dusk - 执行 javascript 脚本并等待 Promise 被解析以返回值

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

我想运行一个等待 promise 返回值的脚本。

$dusk->script('return //something');

我想要运行的 JavaScript 函数是一个 promise 。

fetch(url).then(r => r.blob()).then(blob => {
var reader = new FileReader();
reader.onload = function() {
var b64 = reader.result.replace(/^data:.+;base64,/, '');
console.log(b64); // I want to return this value
};
reader.readAsDataURL(blob);
});

我想返回 b64 变量,但这不会发生。

$b64 = $dusk->script("
var b64;

fetch(url).then(r => r.blob()).then(blob => {
var reader = new FileReader();
reader.onload = function() {
b64 = reader.result.replace(/^data:.+;base64,/, '');
};
reader.readAsDataURL(blob);
});

// When `b64` is ready, I want to return it
return b64;
");

最佳答案

这是一种可能性。我认为它也适用于黄昏/ Selenium 。线索是 onload 函数基本上是一个回调,所以我们想使用该回调来解析 Promise。如果您想要看起来同步的代码,async/await 也可以为您做到这一点,但最终结果是相同的,返回一个 promise ,以便您可以继续 promise 链。

fetch(url)
.then(r => r.blob())
.then(blob => new Promise(( resolve ) => {
var reader = new FileReader();
reader.onload = function() {
var b64 = reader.result.replace(/^data:.+;base64,/, '');
resolve( b64 );
};
reader.readAsDataURL(blob);
})
.then( b64 => {
// do something with b64
});

这确实意味着您无法将其返回到外部 $b64 =

编辑:所以而不是

$b64 = fetch(url)
.then( response => ... )
.then( blob => ... )
.then( image => ... );
renderImage( $b64 );

你想做

fetch(url)
.then( response => ... )
.then( blob => ... )
.then( image => ... )
.then( renderImage );

或者:

var $b64 = fetch(url)
.then( response => ... )
.then( blob => ... )
.then( image => ... );
$b64.then( renderImage );

编辑2:

不要等待实际的 Promise,而是等待 Promise 的结果显示在屏幕上,因此根据 dusk 文档,在 dusk 引发错误之前,您需要给 Promise 5 秒的时间来解决。

如果 Promise 将在页面上呈现结果,请尝试检测图像将呈现到的图像标记中的更改。

$dusk->script("
fetch(url).then(r => r.blob()).then(blob => {
var reader = new FileReader();
reader.onload = function() {
var b64 = reader.result.replace(/^data:.+;base64,/, '');
document.querySelector( 'body' ).classList.add( 'loaded_image' );
};
reader.readAsDataURL(blob);
});
");

$dusk->waitUntil('body.loaded_image');
<小时/>

解决方案:

$dusk->script('
var url = document.getElementById("img_file").getAttribute("src");

fetch(url)
.then(r => r.blob())
.then(blob => new Promise(( resolve ) => {
var reader = new FileReader();
reader.onload = function() {
var b64 = reader.result.replace(/^data:.+;base64,/, "");
resolve( b64 );
};
reader.readAsDataURL(blob);
}))
.then( b64 => {
$("body").append(`<input id="b64string" value="${b64}">`);
});
');

// wait until ajax to be finished
$dusk->waitUntil("!$.active", 30);

$b64Img = $dusk->script("return document.getElementById('b64string').value;"); // this returns array

dd($b64Img[0]); // works!

关于javascript - Laravel Dusk - 执行 javascript 脚本并等待 Promise 被解析以返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55742103/

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