首先发生什么:setTimeout 0或等待Promise.resolve?

时间:2019-01-10 09:22:20

标签: javascript promise async-await

我在Node和Chrome中看到了这种行为:

const Url = "https://acuityscheduling.com/api/v1/calendars";
const Data = {
    userid: XXX,
    userkey: 'XXX'
};
$.ajax() ({
    url: Url,
    type: "POST",
    data: Data,
    dataType: JSON,
    success: function (result){
        console.log(result);
    },
    error: function(error){
        console.log("Error ${error}");
    }
});

我的问题是,这是一致的行为吗?也就是说,根据规范,在已记忆/已经解决的承诺中,setTimeout(()=>{ console.log('timeout') }, 0) Promise.resolve().then(()=>{ console.log('promise') }) console.log('sync') // output order: // sync // promise // timeout then是否总是在await之前触发?

我想在如下所示中使用它,如果我的承诺中有记忆的结果,则返回一件事,否则返回:

setTimeout(fn, 0)

4 个答案:

答案 0 :(得分:3)

Promise.resolve将调度微任务,而setTimeout调度宏任务。并且微任务将在运行下一个宏任务之前运行。

一般有关事件循环的更多信息:https://www.youtube.com/watch?v=8aGhZQkoFbQ

有关事件循环的更多技术细节:https://www.youtube.com/watch?v=cCOL7MC4Pl0

答案 1 :(得分:1)

据我了解,select [columnname] from [tablename] where [columnname] in ('value1','value2')在调用堆栈中的优先级比Promise高,当然,同步代码块将是第一个执行的代码。在那种情况下,是的,上面观察到的行为(按照同步代码块,promise.resolve和setTimeout 0的顺序)应该是一致的。

答案 2 :(得分:1)

因此您有2个异步等待状态,但是请注意,其中一个是恒定的,而一个正在变化(可变)。超时是在XML变量中设置的,而允诺可能会永久保留。如果我很好地理解了您的问题,那么当您依赖的内容花费太长而又太短时,除非您对其中之一施加了常量(例如超时),否则最终可能会导致运行时间意外缩短(!)为此,而是出于代码安全性而非性能的考虑,使用整体结构。

答案 3 :(得分:0)

不能保证一个人会比另一个人先。如果要保证执行顺序,请使用Promises。