我试图在javascript中包围promise对象。所以我在这里有一小段代码。我在promise对象的两边都有一个promise对象和两个console.log()。我认为它会打印
您好
有
zami
但它打印
HI
zami
there
为什么它就像那样。我对如何工作没有任何理解,但我理解异步回调在javascript中是如何工作的。任何人都可以对这个主题有所了解吗?
console.log('hi');
var myPromise = new Promise(function (resolve, reject) {
if (true) {
resolve('There!');
} else {
reject('Aww, didn\'t work.');
}
});
myPromise.then(function (result) {
// Resolve callback.
console.log(result);
}, function (result) {
// Reject callback.
console.error(result);
});
console.log('zami');
答案 0 :(得分:14)
Promise执行是异步的,这意味着它已被执行,但程序不会等到它完成后继续执行其余的代码。
基本上,您的代码正在执行以下操作:
如果你想要它打印'你好,zami',你将不得不
myPromise.then(function (result) {
// Resolve callback.
console.log(result);
console.log('zami');
}, function (result) {
// Reject callback.
console.error(result);
});
答案 1 :(得分:4)
即使你同步解决了承诺,你传递给then
的处理程序也会被异步调用。这是根据defined specification:
onFulfilled和onRejected异步执行,之后调用事件循环,并使用新堆栈
答案 2 :(得分:3)
Javascript中的promise是一个对象,代表异步操作的最终完成或失败。承诺代表了某个价值的代理,该价值在将来的某个时候会得到体现。
一个承诺可以具有以下三种状态:
我们可以通过以下方式创建承诺:
let prom = new Promise((res, rej) => {
console.log('synchronously executed');
if (Math.random() > 0.5) {
res('Success');
} else {
rej('Error');
}
})
prom.then((val) => {
console.log('asynchronously executed: ' + val);
}).catch((err) => {
console.log('asynchronously executed: ' + err);
}).finally(() => {
console.log('promise done executing');
});
console.log('last log');
景点:
then
方法以回调为第一个参数,该回调在实现承诺时异步执行。then
方法将回调作为第二个参数,该回调在承诺拒绝时异步执行。但是,我们通常为此使用catch
方法(因为它比较冗长),该方法还接受了一个在答应拒绝时异步执行的回调。 catch
与then(null, failCallback)
基本相同。then
回调函数将解析值(在这种情况下为字符串“ success”)作为第一个参数。 catch
回调函数将拒绝的值(在这种情况下为字符串“ Error”)作为第一个参数。 finally
方法接收一个回调,该回调在承诺实现和拒绝上执行。在这里,我们可以编写“清除”代码,无论承诺结果如何,该代码都必须始终执行。在您的代码中,“ Zami”被打印在“ there”之前,因为记录“ there”的日志位于then
回调函数中。我们之前指出,这些回调是异步执行的,因此将在最后执行。
答案 3 :(得分:1)
答案 4 :(得分:0)
Promise是一个对象,代表异步操作的最终完成或失败。
以下是promise的示例:
const post = new Promise((resolve, reject) => {
resolve("Appended from getPostWithPromise()");
});
const getPostWithPromise = function () {
post
.then(function (fulfilled) {
$("body").append("<div>" + fulfilled + "</div>");
})
.catch(function (error) {
console.log(error);
});
}
function getPostWithoutPromise() {
$("body").append("<div>Appended from getPostWithoutPromise()</div>");
}
$(function () {
getPostWithPromise(); // this will print last
getPostWithoutPromise(); // this will print first
$("body").append("<div>Appended directly</div>"); // second
});
您可以对其进行测试=> JavaScript Promises example
要了解详细信息,可以阅读这篇文章=> https://scotch.io/tutorials/javascript-promises-for-dummies
答案 5 :(得分:0)
承诺:
new Promise((resolve, reject) => {
resolve(whateverObject)
reject(whateverErrorObject)
})
非常简单的概念兄弟!
答案 6 :(得分:-1)
let prom = new Promise((res, rej) => {
console.log('synchronously executed');
if (Math.random() > 0.5) {
res('Success');
} else {
rej('Error');
}
})
prom.then((val) => {
console.log('asynchronously executed: ' + val);
}).catch((err) => {
console.log('asynchronously executed: ' + err);
}).finally(() => {
console.log('promise done executing');
});
console.log('last log');