等待承诺。全部在同步函数中,基本上是阻塞的!javascript

等待承诺。全部在同步函数中,基本上是阻塞的!javascript,javascript,ajax,asynchronous,synchronization,es6-promise,Javascript,Ajax,Asynchronous,Synchronization,Es6 Promise,我有很多我想要执行的syncrhounous函数,它们是基本的ajax请求,这些请求将把html呈现给DOM 为了做到这一点,我必须执行所有这一切 一个接一个的请求。但我想让这些同步函数同时异步,并等待它们变成芬兰语,以加快速度。这必须发生在同步函数内部。但我的理解是,这在javascript中不起作用,但我想听听你们有什么要说的 所以我的尝试是将所有这些同步请求添加到异步承诺中,然后执行一个Promise.all调用。我等不及promise.all.then了,因为主线程将在这个主同步线程/函

我有很多我想要执行的syncrhounous函数,它们是基本的ajax请求,这些请求将把html呈现给DOM

为了做到这一点,我必须执行所有这一切 一个接一个的请求。但我想让这些同步函数同时异步,并等待它们变成芬兰语,以加快速度。这必须发生在同步函数内部。但我的理解是,这在javascript中不起作用,但我想听听你们有什么要说的

所以我的尝试是将所有这些同步请求添加到异步承诺中,然后执行一个Promise.all调用。我等不及promise.all.then了,因为主线程将在这个主同步线程/函数之后继续执行其余的代码。因此,我想知道是否有方法阻止主线程以等待这些异步调用

这是我所说的一个简短的例子

var syncfunc = () => {
var getPromise = () => {
    return new Promise((resolve) => {
        var asyncAjaxRequest = async function() {
            doSomeStuff();
            resolve();
        }
    })
}
var promises = [getPromse(), getPromse(), getPromse()];


Promise.all(promises);

console.log('i want this console.log to execute after all promises executed doSomeStuff');

/**
 * 
 * Promise.all(promises).then(() => {
        // I cant use this, because its script in other files that will execute if i wait like this
    })
 */
}
我知道。然后将在所有解析完成后执行,但我基本上想阻止这个同步线程,等待所有其他异步线程完成


如果可以,我当然会根据自己的需要更改结构,但问题和我尝试这样做的原因是因为我使用sitevision框架,并且希望在打印模块打开打印窗口之前向dom添加一些内容。调用每个函数并不是一个好办法,而是慢下来。我还尝试将window.print=null设置为禁用打印功能,然后在承诺解析时重新添加打印功能,但它根本不起作用

您可以使用async/await来解决这个问题。这就是你如何做到的:

async function promiseSolver() {
var getPromise = () => {
    return new Promise((resolve) => {
        var asyncAjaxRequest = async function() {
            doSomeStuff();
            resolve();
        }
    })
}
var promises = [getPromse(), getPromse(), getPromse()];


await Promise.all(promises);

console.log('i want this console.log to execute after all promises executed doSomeStuff');

/**
 * 
 * Promise.all(promises).then(() => {
        // I cant use this, because its script in other files that will execute if i wait like this
    })
 */
}

基本上,您的代码将等待.all完成,然后继续处理。请注意,当代码执行是同步的时,代码将是非阻塞的。

如果没有外部代码,您无法在纯Javascript中将异步操作转换为同步操作。事件驱动的JS引擎就是不能这样工作

根据定义,异步操作启动将执行转移到本机代码的操作,然后返回到解释器,解释器随后继续执行后面的代码。本机代码将在JS事件队列完成时向其添加一个事件,以允许解释器事件循环为异步操作的完成提供服务。如果您是创建某种类型的块(例如半无限while循环)的负责人,这将阻止解释器执行更多代码,那么您将陷入僵局。阻塞解释器的循环阻止JS解释器处理发出异步操作结束信号的事件。所以,你有一个循环在等待某件事情的完成,但它所等待的事情在循环完成之前无法完成——僵局

因此,由于JS解释器的单线程事件循环特性,您不能完全在Javascript块中等待异步操作的结束

通常,正确的设计是重构周围的代码/基础结构,以使用异步操作和异步结果回调或承诺

如果这是node.js,有几个可怕的黑客可以让你得到这个结果,但他们阻止了整个解释器,所以几乎从来不是一个理想的设计

第一个选项涉及编写一个自定义nodejs插件异步操作,该操作在本机代码中完成,该代码提供了一个阻塞接口,该接口在操作完成之前不会返回

第二个选项涉及使用诸如child_process.execFileSync创建阻塞子进程,在该子进程中运行代码,然后在该进程完成后继续

这两个问题我都可以考虑,但决不是解决问题的理想方法。但是,我确实想向您展示,为了阻止异步操作,必须将其移出Javascript或进程,必须做些什么


如果你不能想出如何用非阻塞、异步操作解决真正的问题,我建议你发布一个新的问题,详细描述真正的问题是什么,我们可以帮助你找到适合你的情况的异步设计。如果您在此处的评论中发布新问题的链接,此处参与的一些人可能会查看新问题并尝试提供帮助。

您无法使异步函数同步。是的,这就是我认为的原因,所以我没有办法解决我的问题?@Hermanjanson:可能有,但我们没有足够的信息来提出建议。例如,显而易见的解决方案是将该行之后的所有内容移动到.then回调中。您不执行Prom的实际原因是什么
ise.allpromises.then=>{console.log;}?因为这就是解决方案……您不能进行一个调用所有ajax请求的异步函数调用吗。然后对初始函数调用wait