Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺。所有如何确保所有承诺都可用?_Javascript_Ajax_Promise_Axios - Fatal编程技术网

Javascript 承诺。所有如何确保所有承诺都可用?

Javascript 承诺。所有如何确保所有承诺都可用?,javascript,ajax,promise,axios,Javascript,Ajax,Promise,Axios,我从Axios AJAX库中获取了这个示例,但是Promises.all()也是如此 到目前为止,我已经了解到,您可以使用promissions.all()检查一系列承诺中的所有承诺是否都已得到解决 这真的很好,但是如果你推动一个承诺,并且它在下一个承诺被推动之前就解决了,会发生什么呢 我猜测,我的平均AJAX调用开销至少为50ms,推送总是在任何AJAX请求之前发生,但仅仅说这是理所当然的并不是真的感觉正确 我可以想到两种解决方案: 使用计数来确保两个(在本例中)AJAX请求都在 数组 检查是

我从Axios AJAX库中获取了这个示例,但是
Promises.all()
也是如此

到目前为止,我已经了解到,您可以使用
promissions.all()
检查一系列承诺中的所有承诺是否都已得到解决

这真的很好,但是如果你推动一个承诺,并且它在下一个承诺被推动之前就解决了,会发生什么呢

我猜测,我的平均AJAX调用开销至少为50ms,推送总是在任何AJAX请求之前发生,但仅仅说这是理所当然的并不是真的感觉正确

我可以想到两种解决方案:

  • 使用计数来确保两个(在本例中)AJAX请求都在
    数组

  • 检查是否存在实际的函数名

  • 其他人是如何处理这个问题的,或者大多数人只是满足于希望在一个AJAX请求能够足够快地得到解决之前,两个AJAX请求都被推送

    axios.all([getUserAccount(), getUserPermissions()])
      .then(axios.spread(function (acct, perms) {
        // Both requests are now complete
      }));
    
    它返回一个承诺,该承诺在iterable参数中的所有承诺都已解决时解决


    Axios.spread
    将从
    getUserAccount
    getUserPermission
    获取解析值。推送是一种同步操作,ajax是异步的。JS将始终在运行任何异步操作之前运行所有同步操作,即使它已经完成。例如:

    for (i=0;i<10000000;i++){
      console.log('looping');
    }
    
    setTimeout(function(){
      console.log('running async')
    }, 0)
    

    for(i=0;i您不必担心在传递给
    Promise之前解析的承诺。all
    Promise。在其(array)参数完全求值之前,不会调用all
    。只有当数组准备就绪时,才会调用
    Promise.all


    Promise.all
    被调用时,这些承诺是否已经被解析并不重要。
    Promise.all
    将检查哪些承诺处于已解析状态,并且仅在所有承诺都已实现时调用其
    然后
    方法。甚至可能数组中的所有承诺都是L已经履行:没问题,只要
    承诺。所有的
    都执行了,它会安排
    然后
    方法的执行。即使这些承诺已经解决的时间也无关紧要。即使它们在一小时前解决了,
    承诺。所有的
    都会正确地完成它的工作。

    不太清楚什么是你是在问。你是在动态地构建承诺数组吗?或者你想知道请求是否会在包装之前以某种方式完成吗?是的,这些承诺是从多个地方推送的。假设一个承诺被推送,而我预期会有两个承诺,那么理论上这个承诺可能会触发一个新的承诺第二个已经被推了?如果是这样的话,需要有一个机制来事先检查这个不?你不需要一个机制来事先检查这个。
    承诺。所有的
    都从一系列承诺中做出了一个承诺。你怎么说他们是从不同的地方推出来的呢这是正确的,
    承诺。all()
    是处理多个AJAX请求的一个极好的解决方案。黄金答案就在这里。虽然异步和同步的解释是正确的,但这并不是为什么要首先计算
    推送
    的原因:这是因为这是JavaScript中正确的计算顺序:一个参数(在本例中为数组)必须在函数(向其传递此参数,即
    Promise.all
    )执行(也同步)之前首先完全求值。因此,这与异步代码没有什么关系。我不想检查承诺是否已解决,因为此信息包含在承诺中,并且确实
    promise。all()
    将为我检查此问题。我想确保
    Promises.all()
    不会在我可能没有在我的数组中推送我想要的所有承诺时触发。但是根据@fatman的回答,
    推送的
    同步
    操作总是在任何
    异步
    请求触发之前发生。所以我想这不再是一个问题。不过感谢你的洞察力,谢谢你。你的arr当您将ay传递给
    Promise.all
    时,ay将完成。我的观点是,无法将不完整的数组传递给
    Promise.all
    (当然,除非您是有意这样做的,并且在调用
    Promise.all
    后修改数组).JavaScript总是在调用传递参数的函数之前首先计算参数。好的,解释器会检查整个代码,并准确地知道最后一项何时被推送到这个数组上。因此,它知道参数已被完全计算,并确保只调用
    Promise.all
    这一点?我猜整个
    async/sync
    的故事仍然适用于这里,但在此之前所做的评估?这很难理解,因为我不知道解释器在push语句完成评估后是如何决定的。如果你的问题不包括使用
    push
    反编码。相反,您有一个具有两个值的数组文本。我要说的是,JavaScript引擎将首先计算每个数组元素(从左到右),计算为两个承诺,然后将这两个值包装到一个数组中,然后调用
    Promise.all
    。此原则与
    Promise.all
    无关。这与
    a=[].concat([1+1,5-3,8*2])相同
    :首先完成算术运算,然后使用这些结果创建数组,然后执行
    concat
    。True。在我的代码示例中,我有两个值,但在我的代码库中,这将是一个空数组,组件将把它们的承诺推入其中,因此将没有初始数组元素。我是