我在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)
答案 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。