使用.then()和没有.then()返回Promise有什么区别?

时间:2017-06-02 05:25:06

标签: javascript asynchronous promise

我正在尝试了解 JavaScript Promises ,到目前为止,我遇到了很多代码,其中一个裸体(缺少更好的单词)Promise被返回,即一个没有任何调用到.then(),以及附加.then()的代码。

两者之间有什么区别?你何时使用另一个?

裸体承诺

myfn1() {
    return new Promise((resolve, reject) => {
        //...resolve or reject
    }
}

附加.then()的承诺

myfn2() {
    return new Promise((resolve, reject) => {
        //...resolve or reject
    }
    .then((res) => {
        //...do something upon resolve
    })
}

3 个答案:

答案 0 :(得分:3)

当您使用then时,您需要确定您希望处理承诺解决的数据(或错误)的位置。如果你立即用then链接它,那么我想你可以立即解决它。

但是你可能想要获得承诺本身,并在其他地方处理结果。也许您有一个服务文件,其唯一目的是创建HTTP请求,但您希望处理不同范围内的数据 - 调用函数的范围:

// service.js
callServer() {
    return new Promise(...)
}

// file.js
callServer().then( /* there's a different scope here */ )

也许你甚至想得到几个承诺,然后使用Promise.all(promisesArray),只有在所有承诺都得到解决后才会采取行动:

const movies = getMovies(); // promise
const actors = getActors(); // promise
const directors = getDirectors(); // promise

Promise([movies, actors, directors]).then(_ => /* handle data */ );

取决于应用程序,可能有很多原因。

答案 1 :(得分:2)

主要区别在于您可以使用从前一个promise链定义的操作结果(通常是异步)。请考虑以下代码:

new Promise((resolve, reject) => {
  // we simulate an async op using setTimeout that returns an object
  setTimeout(() => resolve({ status: 'ok' }), 2300);
  // the value of res is defined as the value that is resolved from the previous promise chain, so in this case the object { status: 'ok'}
}).then(res => {
  // do something with resolved result
  console.log(res)
})

如果没有then方法,您将无法获得前一个保证链中定义的返回值的值。

答案 2 :(得分:1)

两者之间的低级别和基本差异在于返回了不同的承诺。

return new Promise((resolve, reject) => {
    //...resolve or reject
}

返回调用new Promise创建的承诺。

return new Promise((resolve, reject) => {
    //...resolve or reject
}
.then((res) => {
    //...do something upon ** fulfillment **
})

返回调用新Promise的then方法返回的promise。

如果调用then的承诺(由上面的new Promise创建)将被拒绝,then使用单个参数返回的承诺将被拒绝,原因相同:a {永远不会调用onFulfilled反序处理程序提供的{1}}。

如果满足第一个承诺,则调用作为第一个参数提供给then的回调,并根据回调的行为确定then返回的承诺:

  • 如果回调返回的值不是承诺,则then返回的承诺将使用相同的值来履行,或

  • 如果回调引发错误,then返回的承诺将被抛出错误的值,

  • 如果回调返回一个承诺(本机承诺或来自库代码的承诺),则从then返回的承诺与其相关联,并最终采用相同的已结算状态并满足价值或拒绝原因作为回调返回的承诺。

决定从函数返回由then创建的承诺,或者由承诺链中的最后一个new Promisethen子句返回的承诺,取决于函数的设计,而不是Promise对象的设计。