Javascript 当使用者不使用';I don’我不指望有承诺

Javascript 当使用者不使用';I don’我不指望有承诺,javascript,asynchronous,promise,async-await,Javascript,Asynchronous,Promise,Async Await,我目前正努力使互操作调用正常工作,因为我无法同步等待javascript中的承诺。 在您考虑将此作为副本关闭之前,请注意,我已经进行了一些搜索,并且我知道它在任何地方都表示不可能同步等待承诺。一旦异步,就始终异步。来源:,。 我见过生成器方法,但我无法正确实现它,因此可能还有一些潜力。 目前,同步等待承诺似乎是不可能的。现在我想知道在我的情况下我能做些什么 注意:我想我应该提到我对javascript不太了解 在我的例子中,我不能完全重新思考我的设计,因为我既不能控制使用者,也不能控制实际的互操

我目前正努力使互操作调用正常工作,因为我无法同步等待javascript中的承诺。
在您考虑将此作为副本关闭之前,请注意,我已经进行了一些搜索,并且我知道它在任何地方都表示不可能同步等待承诺。一旦异步,就始终异步。来源:,。
我见过生成器方法,但我无法正确实现它,因此可能还有一些潜力。
目前,同步等待承诺似乎是不可能的。现在我想知道在我的情况下我能做些什么

注意:我想我应该提到我对javascript不太了解

在我的例子中,我不能完全重新思考我的设计,因为我既不能控制使用者,也不能控制实际的互操作调用。我唯一能完全控制的是我交给消费者的东西

以下是我的问题的基本示例(,代码如下)。
我有一个接受或拒绝索引的过滤函数。该函数是传递给使用者的配置对象的成员(我完全控制配置对象)。 使用者稍后使用此筛选器来确定是否应筛选出索引。我对消费者没有控制权,消费者可以随时使用过滤器,而我对此没有影响。
现在,如果我只是在配置对象中使用一个普通的非异步函数,那么一切都很好。但是我想把我的电话转接到C#,在那里使用一个过滤器并将结果返回给消费者。 我正在使用blazor,interop调用返回一个承诺(还有一个同步方法,但并不适用于所有blazor变体),因此我必须等待它来获得值。为了等待一些东西,我必须使我的函数异步,这意味着它也将返回一个承诺。现在我在这个一度异步,总是asnyc。消费者只是检查过滤器返回的值是否真实,因为承诺是一个对象,所以无论它将解析为什么,它都是真实的

var normalFilter = index => index % 2 == 0;
var asyncFilter = async index => {
    // same filter but returns after 500ms. In the actual application the result is returned from a c# function
    return await fakeInteropCall(index, normalFilter);
}

var conf = {
    filter: normalFilter    // if you put asyncFilter here, everything will be filtered
};

fakeConsumer(conf);         // call the consumer with the config. Note that in the actual application, the consumer just stores the filter and uses it later. I can't influence when the filter gets executed.

// I can't change this consumer, it's actually chart.js
function fakeConsumer(config) {
    for (let i = 0; i < 5; i++) {
        if (config.filter(i)) {
            console.log("filtered " + i);
        } else {
            console.log(i);
        }
    }
}

// I can't change this interop call, it's from blazor and only the async version works on all variants
function fakeInteropCall(index, filterFunc) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(filterFunc(index));
        }, 500);
    });
}
var normalFilter=index=>index%2==0;
var asyncFilter=异步索引=>{
//相同的过滤器,但在500毫秒后返回。在实际应用中,结果是从c#函数返回的
return wait fakeInteropCall(索引,normalFilter);
}
变量配置={
filter:normalFilter//如果将asyncFilter放在这里,所有内容都将被过滤
};
伪造消费者(conf);//使用配置调用使用者。请注意,在实际应用程序中,使用者只存储过滤器并在以后使用。我无法影响过滤器何时执行。
//我不能改变这个消费者,它实际上是chart.js
函数fakeConsumer(配置){
for(设i=0;i<5;i++){
if(配置过滤器(i)){
控制台日志(“过滤”+i);
}否则{
控制台日志(i);
}
}
}
//我无法更改这个互操作调用,它来自blazor,只有异步版本可以在所有变体上工作
函数fakeInteropCall(索引、过滤器函数){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
解析(filterFunc(index));
}, 500);
});
}
如何确保此消费者获得正确的值?

最后一种方法是使用非异步互操作调用,并且只支持一半blazor变体,但这将是非常不幸的。

如果消费者不知道承诺,则需要解决承诺,然后使用值调用消费者。正如所有引用告诉您的,您不能同步异步操作。@jonrsharpe我应该在本文中提到这一点,但正如您在代码注释中所看到的,我不能这样做,因为我只是注册了它。使用者将使用我的过滤器作为渲染事件的回调,我实际上不影响何时调用我的函数,我只是提供它。“现在我使用的是一次异步,始终是asnyc。”-看起来您已经理解了。如果使用者需要同步返回值,则不能执行任何异步操作。“还有一种同步方法”-那么你应该使用它。另一种方法是改变你的整个设计:在启动chart.js之前异步计算所有索引的过滤,将结果存储在数据结构中,并在chart.js调用筛选函数时同步查找。@Bergi我不能执行第二个操作,因为我展示的示例非常简单,只使用一个筛选函数,但在实际示例中,它必须适用于所有回调,而不管参数(使用…args完成)和返回类型如何(js(太)灵活了)。这意味着我不知道回调需要什么参数,也不知道它返回什么,我只是将它委托给C#并处理它。我认为唯一的解决方案是确定回调是否有返回值,如果有,使用同步并在不支持的服务器端抛出异常,其余使用异步(只是没有等待)。如果使用者不知道承诺,则需要解析承诺,然后使用值调用使用者。正如所有引用告诉您的,您不能同步异步操作。@jonrsharpe我应该在本文中提到这一点,但正如您在代码注释中看到的,我不能这样做,因为我只是注册了它。使用者将使用我的过滤作为渲染事件的回调,我实际上不影响何时调用我的函数,我只是提供它。“现在我使用的是一次异步,始终是asnyc。”-看起来您已经理解了。如果使用者需要同步返回值,您就不能做任何异步操作。“还有一个同步方法”-然后你应该使用它。另一种方法是改变你的整个设计:在启动chart.js之前异步计算所有索引的过滤,将结果存储在数据结构中,然后在chart.js调用过滤函数时同步查找。@Bergi我不能做第二个,因为