理解javascript承诺对象

时间:2016-09-12 20:20:36

标签: javascript promise

我试图在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');

7 个答案:

答案 0 :(得分:14)

Promise执行是异步的,这意味着它已被执行,但程序不会等到它完成后继续执行其余的代码。

基本上,您的代码正在执行以下操作:

  1. 记录'嗨'
  2. 创建承诺
  3. 执行承诺
  4. Log' zami'
  5. 承诺得到解决并记录'有'。
  6. 如果你想要它打印'你好,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是一个对象,代表异步操作的最终完成或失败。承诺代表了某个价值的代理,该价值在将来的某个时候会得到体现。

一个承诺可以具有以下三种状态:

  1. 待定:这是承诺的初始状态,承诺现在正在等待已解决被拒绝。例如,当通过AJAX请求与网络联系并将请求包装在Promise中时。然后,诺言将在未返回请求的时间窗口中挂起。
  2. 已完成:成功完成操作后,诺言便会兑现。例如,当我们使用AJAX获取一些JSON数据并将其包装在Promise中进行网络连接时。当我们成功取回数据时,承诺就兑现了。
  3. 已拒绝::操作失败时,承诺将被拒绝。例如,当我们使用AJAX获取一些JSON数据并将其包装在Promise中进行网络连接时。当我们收到404错误时,承诺已被拒绝。

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');

景点:

  • promise构造函数内部的代码是同步执行的。
  • then方法以回调为第一个参数,该回调在实现承诺时异步执行。
  • then方法将回调作为第二个参数,该回调在承诺拒绝时异步执行。但是,我们通常为此使用catch方法(因为它比较冗长),该方法还接受了一个在答应拒绝时异步执行的回调。 catchthen(null, failCallback)基本相同。
  • then回调函数将解析值(在这种情况下为字符串“ success”)作为第一个参数。
  • catch回调函数将拒绝的值(在这种情况下为字符串“ Error”)作为第一个参数。
  • finally方法接收一个回调,该回调在承诺实现和拒绝上执行。在这里,我们可以编写“清除”代码,无论承诺结果如何,该代码都必须始终执行。

您的示例:

在您的代码中,“ Zami”被打印在“ there”之前,因为记录“ there”的日志位于then回调函数中。我们之前指出,这些回调是异步执行的,因此将在最后执行。

答案 3 :(得分:1)

我建议您了解事件循环在JavaScript中的工作方式。

花点时间看start

这将清除您的疑虑。 this Video.

答案 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)
})
  • 只是可以与then()链接的对象
  • 您也可以做出承诺!您可以返回该成功参数(解决)和错误参数(拒绝)中的任何对象

非常简单的概念兄弟!

答案 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');