Javascript 我如何知道哪个承诺会首先解决?

Javascript 我如何知道哪个承诺会首先解决?,javascript,promise,Javascript,Promise,我有一个片段,我故意把Promise.resolvec放在Promise.resolvea之前,但我注意到底部Promise的真正价值。所有。。。正在首先记录 const https = require('https'); function getData(substr) { let url = ``; return new Promise((resolve, reject) => { try { https.get(url, re

我有一个片段,我故意把Promise.resolvec放在Promise.resolvea之前,但我注意到底部Promise的真正价值。所有。。。正在首先记录

const https = require('https');

function getData(substr) {
    let url = ``;
    return new Promise((resolve, reject) => {
        try {
            https.get(url, res => {
                let s = '';
                res.on('data', (d) => {
                    s += d
                });

                res.on('end', () => {
                    let data = JSON.parse(s);
                    resolve(data);
                })
            })
        } catch (e) {
            reject(e);
        }
    })
}

let a = getData('spiderman');

let b;

let c = getData('superman');

Promise.resolve(c)
    .then(value => console.log(value));

Promise.resolve(a)
    .then(value => b = value);

Promise.all([a]).then(values => console.log(values[0] === b)); 

为什么会这样,有什么解释吗?我认为既然Promise.resolvec是第一位的,那么Promise c将首先解析并被记录。或者除了使用回调之外,没有办法真正依赖日志的顺序吗?避免此类问题的最佳做法是什么

这些是异步调用,在使用传入的提供函数完成解析时调用

没有办法强迫其中一个在之前完成,如果您需要,您应该运行这些同步


当您调用时。则仅在函数完成时调用此函数,而不是在调用.resolve时调用此函数。

承诺解析顺序不受保证。这就是异步代码的要点

如果您依赖于执行顺序,则应使用同步代码。

如果希望在执行下一步之前完成两个请求,请使用Promise.all

let a = getData('spiderman');

let c = getData('superman');

Promise.all([a, c]).then(([spidyResults, superResults]) => {
    // both have sompleted
    // do stuff with each set of results

}).catch(err => console.log('Ooops, one of them failed') );

正如前面所说,承诺完成的顺序是不保证的,因为这是一个异步操作


如果你真的需要按照一定的顺序执行,你需要把下一个要执行的东西放在里面,或者使用异步和等待,这会更干净。

ah我明白了,这完全是有道理的。非常感谢您的投入!这是一个公平的观点。我想我只是想弄清楚是否有办法不使用then。。。但我想这就是它存在的原因。再加上其他几点:由于您已经从getDataparam返回了一个完整的承诺,并带有拒绝/解析,因此确实不需要promise.resolvec。然后。。。。它可能是简单的c。然后…是的,除了回调模式,你们也可以依赖1。异步/等待承诺以维持执行顺序2。链接/内部。然后一个接一个地取决于用例和功能(如果需要)。