我有这个GreaseMonkey的用户脚本。我创建了一个函数(A),该函数调用了另一个函数(B)。我想等待进一步运行A函数,然后等待B函数返回。函数B包含一个按钮,因此实际上我希望A等待按钮按下。
我使用async
和await
进行了尝试,但这对我没有用,这表明我现在尝试使用.then()
选项。在then()
中,我创建了一个函数(nextI
),以在运行函数B后增加i
。
function A(){
var i = 0
while (i < 3){
var data = jsonResponse[i];
var x = data.x;
var y = data.y;
B(x, y).then(
nextI(i)
)
}
)
function B(x, y){
// do some stuff
let button = document.getElementById("button");
button.addEventListener("click", () => {
console.log("Button clicked.");
return
});
}
function nextI(i){
return i + 1
}
所以我想暂停A直到脚本B完成,然后单击按钮。
答案 0 :(得分:0)
在使用.then()
之前,您首先必须返回承诺。
function B(x, y){
return new Promise((resolve, reject) => {
// do something here
let button = document.getElementById("button");
button.addEventListener("click", () => {
console.log("Button clicked.");
resolve('foo');
});
});
}
看看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
答案 1 :(得分:0)
Number
按值传递因此,将i
赋予nextI
会增加本地副本(即输入参数)。
B
不返回Promise
function B(x, y) {
let button = document.getElementById("button");
// FIX HERE
return new Promise(resolve =>
button.addEventListener("click", () => {
console.log("Button clicked.");
resolve('some data')
})
)
}
Promise#then
接受功能因此,B (nextI (i))
是不正确的,但是B(() => nextI (i))
。
那里应该还有其他问题。例如,您正在以 fire&forget 的方式运行返回类型/值为Promise
的函数。看看Promise.all
或Promise.race
。