【问题标题】:How to wait until a callback is finished to return from ES6 Proxy如何等待回调完成从 ES6 代理返回
【发布时间】:2021-05-11 00:18:03
【问题描述】:

我不能使用 Promise,因为它会强制用户将所有内容转换为同步方法的异步函数。有没有办法强制代理在回调完成之前不返回?

function callbackCase() {
    function saySomething(callback) {
        callback("Stackoverflow");
    }

    console.error = new Proxy(console.error, {
        apply: (target, thisArg, args) => {
            saySomething((result) => {
                return result;
            })
        }
    })

    let test = console.error();

    console.log("From Callback Case", test);
}




function nonCallbackCase() {
    console.errors = new Proxy(console.error, {
        apply: (target, thisArg, args) => {
            return "Stackoverflow";
        }
    })

    let test = console.errors();

    console.log("From Non Callback Case", test);
}


callbackCase()
nonCallbackCase()

【问题讨论】:

  • 没有。为什么您认为代理会对此有所帮助?

标签: javascript ecmascript-6 emscripten es6-proxy


【解决方案1】:

有没有办法强制代理在回调完成之前不返回?

不,没有。您不能在 Javascript 中将异步操作变为同步操作。您尝试做的任何事情(例如在标志上循环)只会阻止事件循环,从而阻止您的异步操作完成,因此您将陷入僵局。

有三种基本方式可以返回异步操作、回调、promise 或事件的结果或完成情况。您将需要使用其中一种机制。

换句话说,您不能将异步操作压缩到同步 API 中。您必须将 API 更改为异步 API。返回与您的异步操作相关的承诺是在 Javascript 中执行此操作的现代方式。这让调用者可以使用.then()await 来监控操作的完成和结果。

【讨论】:

  • Promise.all 不就解决问题了吗?
  • @jfriend00 那么生成器函数呢?我在五分钟前发现了它们,似乎它们可以暂停,但一个问题是它们返回了一个类似 {value: "result go here"} 的对象,我需要直接返回结果..
  • @jeffbRTC - 生成器函数不会将异步操作变成同步操作,所以我看不出它们如何回答您提出的问题。
  • @jfriend00 我说你他们可以暂停,当异步操作完成后,恢复然后返回。
  • @jeffbRTC 就像async functions 一样,生成器function*s 只会在调用者的配合下暂停——它们不会暂停整个线程,而只会暂停函数体。
猜你喜欢
  • 2020-04-17
  • 1970-01-01
  • 2019-03-03
  • 2016-03-09
  • 2016-02-17
  • 1970-01-01
  • 2020-01-02
  • 2016-09-03
相关资源
最近更新 更多