我试图在IE9 +上实现原生承诺,似乎Internet Explorer不识别"Promise"类/对象.我在http://caniuse.com/#search=Promise中搜索并看到IE没有Promise对象.但这很奇怪,因为jQuery和Angular可以使用promises并在IE9 +中工作. 也许他们正在实施自己的承诺?**我可以实现自己的承诺吗?**
我想知道JS承诺是否是es5的一部分?如果是这样,为什么它有时在旧版浏览器中不起作用,我们必须为它添加一个polyfill.另外,在这种情况下应该添加哪种polyfill,es5 one或es6?我对此有点困惑.
JavaScript是单线程语言,因此它一次只执行一个命令.异步编程通过Web API(用于事件处理的DOM,用于AJAX调用的XMLHttpRequest,用于setTimeout的WindowTimers)和由浏览器管理的事件队列来实现.到现在为止还挺好!现在考虑一下,以下非常简单的代码:
$('#mybox').hide(17000);
console.log('Previous command has not yet terminated!');
...
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释上面的基本机制吗?由于.hide()还没有完成(动画持续17秒)并且JS引擎正在处理它并且它能够一次执行一个命令,它以哪种方式进入下一行并继续运行剩下的代码?
如果您的答案是动画创建了promises,那么问题仍然是:JavaScript如何同时处理多个事物(执行动画本身,在承诺的情况下观察动画队列并继续执行下面的代码). ..).
此外,我无法解释jQuery中的promises如何工作,如果他们必须观察他们的父Deferred对象,直到它被解析或拒绝 ,这意味着代码执行,同时执行剩余的代码.这怎么可能在单线程方法中?理解AJAX调用我没有问题,因为我知道它们被JS引擎带走了......
最近,向我展示了一段代码,这些代码是在全栈开发人员访谈中被要求的。它涉及创建一个Promise,应聘者应在其中实现,将其传递给resolve函数,然后将2链接起来。
我试图非常天真地实现Promise只是为了使代码正常工作。创建了一个接受解析器函数的ctor,创建了一个then函数,该函数接受一个回调并返回Promise,并简单地在resolver函数上调用该回调。
class MyPromise {
constructor(resolver) {
this.resolver = resolver;
}
then(callback) {
const result = new MyPromise(callback);
this.resolver(callback);
return result;
}
}
promise = new MyPromise(
(result) => {
setTimeout(result(2), 500);
});
promise.then(result => {
console.log(result);
return 2 * result;
}).then(result => console.log(result));
Run Code Online (Sandbox Code Playgroud)
预期结果是2,4-就像在真正的Promise上运行一样。但是我得到了2,2。我在弄清楚如何获取第一个“ then”的返回值并将其传递时遇到了麻烦。
当承诺产生和消耗时,我对幕后发生的事情感到非常困惑。请澄清我的观点,并对我的英语不好表示歉意。
接下来发生什么 ?当then方法被调用时,方法的代码then会转到后台吗?我想它会进入后台,变量是 console.log // 10
主代码执行完成后,异步代码启动setTimeout回调开始执行,执行完成后,promise 得到满足,resolved 函数返回值。这个值如何存储在 Promise 对象中以及then方法中发生了什么?
let myPromise = new Promise (
(resolve, reject) => {
setTimeout(() => {
console.log(getIDs)
resolve(10);
}, 1500);
}
)
let a = 10
myPromise.then(val => {
console.log(val);
})
console.log(a)
Run Code Online (Sandbox Code Playgroud) 我有一些方块从页面上滑下来,以链接的承诺方式:https : //jsfiddle.net/u4x0qwfo/3
代码是:
new Promise(function(resolve, reject) {
$("#shape").css({
top: 100
});
setTimeout(function() {
resolve();
}, 1000);
}).then(function() {
return new Promise(function(resolve, reject) {
$("#shape2").css({
top: 100
});
setTimeout(function() {
resolve();
}, 1000);
});
}).then(function() {
return new Promise(function(resolve, reject) {
$("#shape3").css({
top: 100
});
setTimeout(function() {
resolve();
}, 1000);
});
}).then(function() {
return new Promise(function(resolve, reject) {
$("#shape4").css({
top: 100
});
setTimeout(function() {
resolve();
}, 1000);
});
});
Run Code Online (Sandbox Code Playgroud)
(该代码在此处的代码段内运行效果不佳:此处第一个方块最初已经向下滑动)。
因此,要查看履行处理程序返回的承诺以及 返回的承诺.then(),我有https://jsfiddle.net/u4x0qwfo/10/
代码是:
let foobar;
let …Run Code Online (Sandbox Code Playgroud) 的承诺/ A +规范是最小规范之一.因此,实施它是理解它的最佳方式.Forbes Lindesay的以下答案向我们介绍了实现Promises/A +规范,Basic Javascript promise实现尝试的过程.但是,当我测试它时,结果并不令人满意:
? 109 tests passed
? 769 tests failed
Run Code Online (Sandbox Code Playgroud)
很明显,Promises/A +规范并不像看起来那么容易实现.您将如何实现规范并向新手解释您的代码?Forbes Lindesay在解释他的代码方面表现非常出色,但遗憾的是他的实现不正确.